2018-04-29 12:47:24 +00:00
/* global swal, axios, ClipboardJS, LazyLoad */
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
// keys for localStorage
const LS _KEYS = {
token : 'token' ,
viewType : {
uploads : 'UPLOADS_VIEW_TYPE'
} ,
selected : {
uploads : 'SELECTED_UPLOADS' ,
users : 'SELECTED_USERS'
}
}
const page = {
2018-04-29 12:47:24 +00:00
// #page
dom : null ,
// user token
2018-10-09 19:52:41 +00:00
token : localStorage [ LS _KEYS . token ] ,
// from api/tokens/verify
username : null ,
permissions : null ,
currentView : null ,
views : {
// config of uploads view
uploads : {
type : localStorage [ LS _KEYS . viewType . uploads ] ,
album : null , // album's id
pageNum : null , // page num
all : null // listing all uploads or just the user's
} ,
// config of users view
users : {
pageNum : null
}
} ,
// id of selected items (shared across pages and will be synced with localStorage)
selected : {
uploads : [ ] ,
users : [ ]
} ,
checkboxes : {
uploads : [ ] ,
users : [ ]
} ,
lastSelected : {
upload : null ,
user : null
} ,
2018-04-29 12:47:24 +00:00
2018-05-05 19:44:58 +00:00
// select album dom for dialogs/modals
2018-04-29 12:47:24 +00:00
selectAlbumContainer : null ,
2018-10-09 19:52:41 +00:00
// cache for dialogs/modals
cache : {
uploads : { } ,
albums : { } ,
users : { }
} ,
2018-04-29 12:47:24 +00:00
clipboardJS : null ,
2018-10-08 18:54:16 +00:00
lazyLoad : null ,
2018-10-18 13:26:40 +00:00
imageExtensions : [ '.webp' , '.jpg' , '.jpeg' , '.bmp' , '.gif' , '.png' ] ,
2018-10-08 18:54:16 +00:00
// byte units for getPrettyBytes()
2018-12-04 11:58:53 +00:00
byteUnits : [ 'B' , 'kB' , 'MB' , 'GB' , 'TB' , 'PB' , 'EB' , 'ZB' , 'YB' ] ,
fadingIn : null
2018-03-28 11:36:28 +00:00
}
2018-01-23 20:06:30 +00:00
2018-07-14 03:42:18 +00:00
page . preparePage = function ( ) {
2018-04-29 12:47:24 +00:00
if ( ! page . token ) {
2018-01-24 15:31:23 +00:00
window . location = 'auth'
2018-04-29 12:47:24 +00:00
return
2018-01-23 20:06:30 +00:00
}
2018-04-29 12:47:24 +00:00
page . verifyToken ( page . token , true )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . verifyToken = function ( token , reloadOnError ) {
2018-10-09 19:52:41 +00:00
axios . post ( 'api/tokens/verify' , { token } ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
return swal ( {
title : 'An error occurred!' ,
text : response . data . description ,
icon : 'error'
} ) . then ( function ( ) {
2018-12-18 17:01:28 +00:00
if ( ! reloadOnError ) return
2018-10-09 19:52:41 +00:00
localStorage . removeItem ( LS _KEYS . token )
location . location = 'auth'
} )
2018-07-14 03:42:18 +00:00
2018-10-09 19:52:41 +00:00
axios . defaults . headers . common . token = token
localStorage [ LS _KEYS . token ] = token
page . token = token
page . username = response . data . username
page . permissions = response . data . permissions
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' )
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . prepareDashboard = function ( ) {
2018-04-29 12:47:24 +00:00
page . dom = document . getElementById ( 'page' )
2018-09-04 15:49:37 +00:00
page . dom . addEventListener ( 'click' , page . domClick , true )
2018-12-07 22:10:35 +00:00
// document.getElementById('auth').style.display = 'none'
2018-01-23 20:06:30 +00:00
document . getElementById ( 'dashboard' ) . style . display = 'block'
2018-10-09 19:52:41 +00:00
if ( page . permissions . moderator ) {
const itemManageUploads = document . getElementById ( 'itemManageUploads' )
itemManageUploads . removeAttribute ( 'disabled' )
itemManageUploads . addEventListener ( 'click' , function ( ) {
page . setActiveMenu ( this )
page . getUploads ( { all : true } )
} )
}
if ( page . permissions . admin ) {
const itemManageUsers = document . getElementById ( 'itemManageUsers' )
itemManageUsers . removeAttribute ( 'disabled' )
itemManageUsers . addEventListener ( 'click' , function ( ) {
page . setActiveMenu ( this )
page . getUsers ( )
} )
}
2018-01-23 20:06:30 +00:00
document . getElementById ( 'itemUploads' ) . addEventListener ( 'click' , function ( ) {
2018-04-29 12:47:24 +00:00
page . setActiveMenu ( this )
2018-10-09 19:52:41 +00:00
page . getUploads ( { all : false } )
2018-01-23 20:06:30 +00:00
} )
2018-05-05 19:44:58 +00:00
document . getElementById ( 'itemDeleteByNames' ) . addEventListener ( 'click' , function ( ) {
page . setActiveMenu ( this )
2018-07-17 03:21:04 +00:00
page . deleteByNames ( )
2018-05-05 19:44:58 +00:00
} )
2018-01-23 20:06:30 +00:00
document . getElementById ( 'itemManageGallery' ) . addEventListener ( 'click' , function ( ) {
2018-04-29 12:47:24 +00:00
page . setActiveMenu ( this )
2018-07-17 03:21:04 +00:00
page . getAlbums ( )
2018-01-23 20:06:30 +00:00
} )
2018-03-24 14:49:44 +00:00
document . getElementById ( 'itemFileLength' ) . addEventListener ( 'click' , function ( ) {
2018-04-29 12:47:24 +00:00
page . setActiveMenu ( this )
2018-07-17 03:21:04 +00:00
page . changeFileLength ( )
2018-03-24 14:49:44 +00:00
} )
2018-01-23 20:06:30 +00:00
document . getElementById ( 'itemTokens' ) . addEventListener ( 'click' , function ( ) {
2018-04-29 12:47:24 +00:00
page . setActiveMenu ( this )
2018-07-17 03:21:04 +00:00
page . changeToken ( )
2018-01-23 20:06:30 +00:00
} )
document . getElementById ( 'itemPassword' ) . addEventListener ( 'click' , function ( ) {
2018-04-29 12:47:24 +00:00
page . setActiveMenu ( this )
2018-07-17 03:21:04 +00:00
page . changePassword ( )
2018-01-23 20:06:30 +00:00
} )
2018-10-09 19:52:41 +00:00
const logoutBtn = document . getElementById ( 'itemLogout' )
2018-07-17 03:21:04 +00:00
logoutBtn . addEventListener ( 'click' , function ( ) {
page . logout ( )
} )
2018-10-09 19:52:41 +00:00
logoutBtn . innerHTML = ` Logout ( ${ page . username } ) `
2018-01-23 20:06:30 +00:00
2018-04-29 12:47:24 +00:00
page . getAlbumsSidebar ( )
2018-09-07 15:22:17 +00:00
2018-12-18 17:01:28 +00:00
if ( typeof page . prepareShareX === 'function' ) page . prepareShareX ( )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . logout = function ( ) {
2018-10-09 19:52:41 +00:00
localStorage . removeItem ( LS _KEYS . token )
2018-01-24 15:31:23 +00:00
location . reload ( '.' )
2018-01-23 20:06:30 +00:00
}
2018-09-04 15:49:37 +00:00
page . getItemID = function ( element ) {
// This expects the item's parent to have the item's ID
2018-10-09 19:52:41 +00:00
let parent = element . parentNode
2018-09-04 15:49:37 +00:00
// If the element is part of a set of controls, use the container's parent instead
2018-12-18 17:01:28 +00:00
if ( element . parentNode . classList . contains ( 'controls' ) ) parent = parent . parentNode
2018-09-04 15:49:37 +00:00
return parseInt ( parent . dataset . id )
}
page . domClick = function ( event ) {
2018-10-09 19:52:41 +00:00
let element = event . target
2018-12-18 17:01:28 +00:00
if ( ! element ) return
2018-09-04 15:49:37 +00:00
// If the clicked element is an icon, delegate event to its A parent; hacky
2018-12-18 17:01:28 +00:00
if ( element . tagName === 'I' && element . parentNode . tagName === 'SPAN' ) element = element . parentNode
if ( element . tagName === 'SPAN' && element . parentNode . tagName === 'A' ) element = element . parentNode
2018-09-04 15:49:37 +00:00
// Skip elements that have no action data
2018-12-18 17:01:28 +00:00
if ( ! element . dataset || ! element . dataset . action ) return
2018-09-04 15:49:37 +00:00
event . stopPropagation ( ) // maybe necessary
2018-10-09 19:52:41 +00:00
const id = page . getItemID ( element )
const action = element . dataset . action
// Handle pagination actions
if ( [ 'page-prev' , 'page-next' ] . includes ( action ) ) {
const views = { }
let func = null
if ( page . currentView === 'uploads' ) {
views . album = page . views . uploads . album
views . all = page . views . uploads . all
func = page . getUploads
2018-12-18 17:41:42 +00:00
} else if ( page . currentView === 'users' ) {
2018-10-09 19:52:41 +00:00
func = page . getUsers
2018-12-18 17:41:42 +00:00
}
2018-10-09 19:52:41 +00:00
switch ( action ) {
case 'page-prev' :
views . pageNum = page . views [ page . currentView ] . pageNum - 1
2018-12-18 17:01:28 +00:00
if ( views . pageNum < 0 )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'This is already the first page.' , 'error' )
2018-12-18 17:01:28 +00:00
2018-10-09 19:52:41 +00:00
return func ( views , element )
case 'page-next' :
views . pageNum = page . views [ page . currentView ] . pageNum + 1
return func ( views , element )
}
}
2018-09-04 15:49:37 +00:00
switch ( action ) {
2018-09-07 15:02:04 +00:00
case 'view-list' :
2018-10-09 19:52:41 +00:00
return page . setUploadsView ( 'list' , element )
2018-09-07 15:02:04 +00:00
case 'view-thumbs' :
2018-10-09 19:52:41 +00:00
return page . setUploadsView ( 'thumbs' , element )
2018-09-07 15:02:04 +00:00
case 'clear-selection' :
return page . clearSelection ( )
case 'add-selected-files-to-album' :
return page . addSelectedFilesToAlbum ( )
case 'bulk-delete' :
return page . deleteSelectedFiles ( )
2018-10-09 19:52:41 +00:00
case 'select' :
return page . select ( element , event )
2018-09-07 15:02:04 +00:00
case 'add-to-album' :
return page . addSingleFileToAlbum ( id )
case 'delete-file' :
return page . deleteFile ( id )
2018-10-09 19:52:41 +00:00
case 'select-all' :
return page . selectAll ( element )
2018-09-07 15:02:04 +00:00
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 )
2018-10-09 19:52:41 +00:00
case 'edit-user' :
return page . editUser ( id )
2018-09-04 15:49:37 +00:00
}
}
2018-07-14 03:42:18 +00:00
page . isLoading = function ( element , state ) {
2018-12-18 17:01:28 +00:00
if ( ! element ) return
if ( state ) return element . classList . add ( 'is-loading' )
2018-05-01 14:41:25 +00:00
element . classList . remove ( 'is-loading' )
2018-03-28 17:40:50 +00:00
}
2018-12-04 11:58:53 +00:00
page . fadeIn = function ( content ) {
if ( page . fadingIn ) {
clearTimeout ( page . fadingIn )
page . dom . classList . remove ( 'fade-in' )
}
page . dom . classList . add ( 'fade-in' )
page . fadingIn = setTimeout ( function ( ) {
page . dom . classList . remove ( 'fade-in' )
} , 500 )
}
2018-10-09 19:52:41 +00:00
page . getUploads = function ( { album , pageNum , all } = { } , element ) {
2018-12-18 17:01:28 +00:00
if ( element ) page . isLoading ( element , true )
if ( pageNum === undefined ) pageNum = 0
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
let url = ` api/uploads/ ${ pageNum } `
2018-12-18 17:01:28 +00:00
if ( album !== undefined ) url = ` api/album/ ${ album } / ${ pageNum } `
2018-01-23 20:06:30 +00:00
2018-12-18 17:01:28 +00:00
if ( all && ! page . permissions . moderator )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'You can not do this!' , 'error' )
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
axios . get ( url , {
headers : {
all : all ? '1' : '0'
}
} ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-09-04 15:49:37 +00:00
}
2018-10-09 19:52:41 +00:00
if ( pageNum && ( response . data . files . length === 0 ) ) {
// Only remove loading class here, since beyond this the entire page will be replaced anyways
2018-12-18 17:01:28 +00:00
if ( element ) page . isLoading ( element , false )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'There are no more uploads.' , 'error' )
}
page . currentView = 'uploads'
page . cache . uploads = { }
const pagination = `
< nav class = "pagination is-centered" >
< a class = "button pagination-previous" data - action = "page-prev" > Previous < / a >
< a class = "button pagination-next" data - action = "page-next" > Next page < / a >
< / n a v >
`
const controls = `
< div class = "columns" >
< div class = "column is-hidden-mobile" > < / d i v >
< div class = "column" style = "text-align: center" >
< a class = "button is-small is-danger" title = "List view" data - action = "view-list" >
< span class = "icon" >
< i class = "icon-th-list" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-danger" title = "Thumbs view" data - action = "view-thumbs" >
< span class = "icon" >
< i class = "icon-th-large" > < / i >
< / s p a n >
< / a >
< / d i v >
< div class = "column" style = "text-align: right" >
< a class = "button is-small is-info" title = "Clear selection" data - action = "clear-selection" >
< span class = "icon" >
< i class = "icon-cancel" > < / i >
< / s p a n >
< / a >
$ { all ? '' : `
< a class = "button is-small is-warning" title = "Add selected uploads to album" data - action = "add-selected-files-to-album" >
< span class = "icon" >
< i class = "icon-plus" > < / i >
< / s p a n >
< / a > ` }
< a class = "button is-small is-danger" title = "Bulk delete" data - action = "bulk-delete" >
< span class = "icon" >
< i class = "icon-trash" > < / i >
< / s p a n >
< span > Bulk delete < / s p a n >
< / a >
< / d i v >
< / d i v >
`
let allSelected = true
if ( page . views . uploads . type === 'thumbs' ) {
page . dom . innerHTML = `
$ { pagination }
< hr >
$ { controls }
< div id = "table" class = "columns is-multiline is-mobile is-centered" >
< / d i v >
$ { pagination }
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-10-09 19:52:41 +00:00
const table = document . getElementById ( 'table' )
for ( let i = 0 ; i < response . data . files . length ; i ++ ) {
const upload = response . data . files [ i ]
const selected = page . selected . uploads . includes ( upload . id )
2018-12-18 17:01:28 +00:00
if ( ! selected && allSelected ) allSelected = false
2018-10-09 19:52:41 +00:00
2018-10-18 13:26:40 +00:00
page . cache . uploads [ upload . id ] = {
name : upload . name ,
thumb : upload . thumb ,
original : upload . file
}
2018-10-09 19:52:41 +00:00
// Prettify
upload . prettyBytes = page . getPrettyBytes ( parseInt ( upload . size ) )
upload . prettyDate = page . getPrettyDate ( new Date ( upload . timestamp * 1000 ) )
let displayAlbumOrUser = upload . album
2018-12-18 17:01:28 +00:00
if ( all ) displayAlbumOrUser = upload . username || ''
2018-10-09 19:52:41 +00:00
const div = document . createElement ( 'div' )
div . className = 'image-container column is-narrow'
div . dataset . id = upload . id
2018-12-18 17:01:28 +00:00
if ( upload . thumb !== undefined )
2018-10-09 19:52:41 +00:00
div . innerHTML = ` <a class="image" href=" ${ upload . file } " target="_blank" rel="noopener"><img alt=" ${ upload . name } " data-src=" ${ upload . thumb } "/></a> `
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
div . innerHTML = ` <a class="image" href=" ${ upload . file } " target="_blank" rel="noopener"><h1 class="title"> ${ upload . extname || 'N/A' } </h1></a> `
div . innerHTML += `
< input type = "checkbox" class = "checkbox" title = "Select this file" data - action = "select" $ { selected ? ' checked' : '' } >
< div class = "controls" >
2018-10-18 13:26:40 +00:00
< a class = "button is-small is-primary" title = "View thumbnail" data - action = "display-thumbnail" $ { upload . thumb ? '' : ' disabled' } >
< span class = "icon" >
< i class = "icon-picture-1" > < / i >
< / s p a n >
< / a >
2018-10-09 19:52:41 +00:00
< a class = "button is-small is-info clipboard-js" title = "Copy link to clipboard" data - clipboard - text = "${upload.file}" >
< span class = "icon" >
< i class = "icon-clipboard-1" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-warning" title = "Add to album" data - action = "add-to-album" >
< span class = "icon" >
< i class = "icon-plus" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-danger" title = "Delete file" data - action = "delete-file" >
< span class = "icon" >
< i class = "icon-trash" > < / i >
< / s p a n >
< / a >
< / d i v >
< div class = "details" >
< p > < span class = "name" title = "${upload.file}" > $ { upload . name } < / s p a n > < / p >
< p > $ { displayAlbumOrUser ? ` <span> ${ displayAlbumOrUser } </span> – ` : '' } $ { upload . prettyBytes } < / p >
< / d i v >
`
table . appendChild ( div )
// page.checkboxes.uploads = Array.from(table.getElementsByClassName('checkbox'))
page . checkboxes . uploads = Array . from ( table . querySelectorAll ( '.checkbox[data-action="select"]' ) )
page . lazyLoad . update ( )
2018-07-14 03:42:18 +00:00
}
2018-10-09 19:52:41 +00:00
} else {
let albumOrUser = 'Album'
2018-12-18 17:01:28 +00:00
if ( all ) albumOrUser = 'User'
2018-10-09 19:52:41 +00:00
page . dom . innerHTML = `
$ { pagination }
< hr >
$ { controls }
< div class = "table-container" >
< table class = "table is-narrow is-fullwidth is-hoverable" >
< thead >
< tr >
< th > < input id = "selectAll" class = "checkbox" type = "checkbox" title = "Select all uploads" data - action = "select-all" > < / t h >
< th style = "width: 25%" > File < / t h >
< th > $ { albumOrUser } < / t h >
< th > Size < / t h >
< th > Date < / t h >
< th > < / t h >
< / t r >
< / t h e a d >
< tbody id = "table" >
< / t b o d y >
< / t a b l e >
< / d i v >
< hr >
$ { pagination }
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-10-09 19:52:41 +00:00
const table = document . getElementById ( 'table' )
for ( let i = 0 ; i < response . data . files . length ; i ++ ) {
const upload = response . data . files [ i ]
const selected = page . selected . uploads . includes ( upload . id )
2018-12-18 17:01:28 +00:00
if ( ! selected && allSelected ) allSelected = false
2018-10-09 19:52:41 +00:00
page . cache . uploads [ upload . id ] = {
name : upload . name ,
2018-10-18 13:26:40 +00:00
thumb : upload . thumb ,
original : upload . file
2018-10-09 19:52:41 +00:00
}
2018-07-14 03:42:18 +00:00
2018-10-09 19:52:41 +00:00
// Prettify
upload . prettyBytes = page . getPrettyBytes ( parseInt ( upload . size ) )
upload . prettyDate = page . getPrettyDate ( new Date ( upload . timestamp * 1000 ) )
let displayAlbumOrUser = upload . album
2018-12-18 17:01:28 +00:00
if ( all ) displayAlbumOrUser = upload . username || ''
2018-10-09 19:52:41 +00:00
const tr = document . createElement ( 'tr' )
tr . dataset . id = upload . id
tr . innerHTML = `
2018-10-12 10:19:14 +00:00
< td class = "controls" > < input type = "checkbox" class = "checkbox" title = "Select this file" data - action = "select" $ { selected ? ' checked' : '' } > < / t d >
2018-10-09 19:52:41 +00:00
< th > < a href = "${upload.file}" target = "_blank" rel = "noopener" title = "${upload.file}" > $ { upload . name } < / a > < / t h >
< th > $ { displayAlbumOrUser } < / t h >
< td > $ { upload . prettyBytes } < / t d >
< td > $ { upload . prettyDate } < / t d >
< td class = "controls" style = "text-align: right" >
< a class = "button is-small is-primary" title = "View thumbnail" data - action = "display-thumbnail" $ { upload . thumb ? '' : ' disabled' } >
< span class = "icon" >
< i class = "icon-picture-1" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-info clipboard-js" title = "Copy link to clipboard" data - clipboard - text = "${upload.file}" >
< span class = "icon" >
< i class = "icon-clipboard-1" > < / i >
< / s p a n >
< / a >
$ { all ? '' : `
< a class = "button is-small is-warning" title = "Add to album" data - action = "add-to-album" >
< span class = "icon" >
< i class = "icon-plus" > < / i >
< / s p a n >
< / a > ` }
< a class = "button is-small is-danger" title = "Delete file" data - action = "delete-file" >
< span class = "icon" >
< i class = "icon-trash" > < / i >
< / s p a n >
< / a >
< / t d >
`
table . appendChild ( tr )
// page.checkboxes.uploads = Array.from(table.getElementsByClassName('checkbox'))
page . checkboxes . uploads = Array . from ( table . querySelectorAll ( '.checkbox[data-action="select"]' ) )
2018-07-14 03:42:18 +00:00
}
2018-10-09 19:52:41 +00:00
}
2018-04-28 23:44:25 +00:00
2018-10-09 19:52:41 +00:00
if ( allSelected && response . data . files . length ) {
const selectAll = document . getElementById ( 'selectAll' )
2018-12-18 17:01:28 +00:00
if ( selectAll ) selectAll . checked = true
2018-10-09 19:52:41 +00:00
}
page . views . uploads . album = album
page . views . uploads . pageNum = response . data . files . length ? pageNum : 0
page . views . uploads . all = all
} ) . catch ( function ( error ) {
2018-12-18 17:01:28 +00:00
if ( element ) page . isLoading ( element , false )
2018-10-09 19:52:41 +00:00
console . log ( error )
return swal ( 'An error occurred!' , 'There was an error with the request, please check the console for more information.' , 'error' )
} )
2018-01-23 20:06:30 +00:00
}
2018-10-09 19:52:41 +00:00
page . setUploadsView = function ( view , element ) {
2018-10-13 04:09:39 +00:00
localStorage [ LS _KEYS . viewType . uploads ] = view
2018-10-09 19:52:41 +00:00
page . views . uploads . type = view
page . getUploads ( page . views . uploads , element )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . displayThumbnail = function ( id ) {
2018-10-09 19:52:41 +00:00
const file = page . cache . uploads [ id ]
2018-12-18 17:01:28 +00:00
if ( ! file . thumb ) return
2018-10-18 13:26:40 +00:00
const div = document . createElement ( 'div' )
div . innerHTML = `
< div class = "field has-text-centered" >
< label class = "label" > $ { file . name } < / l a b e l >
< div class = "controls" >
< img id = "swalThumb" src = "${file.thumb}" >
< / d i v >
< / d i v >
`
if ( file . original ) {
div . innerHTML += `
< div class = "field has-text-centered" >
< div class = "controls" >
< a id = "swalOriginal" type = "button" class = "button is-breeze" data - original = "${file.original}" > Load original < / a >
< / d i v >
< / d i v >
`
div . querySelector ( '#swalOriginal' ) . addEventListener ( 'click' , function ( ) {
const button = this
const original = button . dataset . original
button . classList . add ( 'is-loading' )
const thumb = div . querySelector ( '#swalThumb' )
const exec = /.[\w]+(\?|$)/ . exec ( original )
const isimage = exec && exec [ 0 ] && page . imageExtensions . includes ( exec [ 0 ] . toLowerCase ( ) )
if ( isimage ) {
thumb . src = file . original
2018-10-19 15:10:30 +00:00
thumb . onload = function ( ) {
button . style . display = 'none'
document . body . querySelector ( '.swal-overlay .swal-modal:not(.is-expanded)' ) . classList . add ( 'is-expanded' )
}
thumb . onerror = function ( ) {
button . className = 'button is-danger'
button . innerHTML = 'Unable to load original'
}
2018-10-18 13:26:40 +00:00
} else {
thumb . style . display = 'none'
const video = document . createElement ( 'video' )
video . id = 'swalVideo'
video . controls = true
video . src = file . original
thumb . insertAdjacentElement ( 'afterend' , video )
2018-10-19 15:10:30 +00:00
2018-10-18 13:26:40 +00:00
button . style . display = 'none'
2018-10-19 15:10:30 +00:00
document . body . querySelector ( '.swal-overlay .swal-modal:not(.is-expanded)' ) . classList . add ( 'is-expanded' )
2018-10-18 13:26:40 +00:00
}
} )
}
2018-07-14 03:42:18 +00:00
return swal ( {
2018-10-18 13:26:40 +00:00
content : div ,
buttons : false
} ) . then ( function ( ) {
const video = div . querySelector ( '#swalVideo' )
2018-12-18 17:01:28 +00:00
if ( video ) video . remove ( )
2018-10-19 14:57:15 +00:00
// Restore modal size
document . body . querySelector ( '.swal-overlay .swal-modal.is-expanded' ) . classList . remove ( 'is-expanded' )
2018-05-01 14:41:25 +00:00
} )
2018-03-29 23:22:08 +00:00
}
2018-10-09 19:52:41 +00:00
page . selectAll = function ( element ) {
const currentView = page . currentView
const checkboxes = page . checkboxes [ currentView ]
const selected = page . selected [ currentView ]
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
for ( let i = 0 ; i < checkboxes . length ; i ++ ) {
const id = page . getItemID ( checkboxes [ i ] )
2018-12-18 17:01:28 +00:00
if ( isNaN ( id ) ) continue
2018-07-14 04:37:36 +00:00
if ( checkboxes [ i ] . checked !== element . checked ) {
checkboxes [ i ] . checked = element . checked
2018-12-18 17:01:28 +00:00
if ( checkboxes [ i ] . checked )
2018-10-09 19:52:41 +00:00
selected . push ( id )
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
selected . splice ( selected . indexOf ( id ) , 1 )
2018-03-29 23:22:08 +00:00
}
}
2018-04-03 15:59:39 +00:00
2018-12-18 17:01:28 +00:00
if ( selected . length )
2018-10-09 19:52:41 +00:00
localStorage [ LS _KEYS . selected [ currentView ] ] = JSON . stringify ( selected )
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
localStorage . removeItem ( LS _KEYS . selected [ currentView ] )
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
page . selected [ currentView ] = selected
element . title = element . checked ? 'Unselect all uploads' : 'Select all uploads'
2018-03-29 23:22:08 +00:00
}
2018-07-14 03:42:18 +00:00
page . selectInBetween = function ( element , lastElement ) {
2018-12-18 17:01:28 +00:00
if ( ! element || ! lastElement ) return
if ( element === lastElement ) return
2018-04-04 18:23:45 +00:00
2018-10-09 19:52:41 +00:00
const currentView = page . currentView
const checkboxes = page . checkboxes [ currentView ]
2018-12-18 17:01:28 +00:00
if ( ! checkboxes || ! checkboxes . length ) return
2018-04-04 18:23:45 +00:00
2018-10-09 19:52:41 +00:00
const thisIndex = checkboxes . indexOf ( element )
const lastIndex = checkboxes . indexOf ( lastElement )
const distance = thisIndex - lastIndex
2018-12-18 17:01:28 +00:00
if ( distance >= - 1 && distance <= 1 ) return
2018-04-04 18:23:45 +00:00
2018-12-18 17:01:28 +00:00
for ( let i = 0 ; i < checkboxes . length ; i ++ )
2018-04-04 18:23:45 +00:00
if ( ( thisIndex > lastIndex && i > lastIndex && i < thisIndex ) ||
( thisIndex < lastIndex && i > thisIndex && i < lastIndex ) ) {
2018-10-09 19:52:41 +00:00
checkboxes [ i ] . checked = true
page . selected [ currentView ] . push ( page . getItemID ( checkboxes [ i ] ) )
2018-04-04 18:23:45 +00:00
}
2018-10-09 19:52:41 +00:00
localStorage [ LS _KEYS . selected . uploads ] = JSON . stringify ( page . selected [ currentView ] )
page . checkboxes [ currentView ] = checkboxes
2018-04-04 18:23:45 +00:00
}
2018-10-09 19:52:41 +00:00
page . select = function ( element , event ) {
const currentView = page . currentView
const lastSelected = page . lastSelected [ currentView ]
2018-12-18 17:01:28 +00:00
if ( event . shiftKey && lastSelected )
2018-10-09 19:52:41 +00:00
page . selectInBetween ( element , lastSelected )
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
page . lastSelected [ currentView ] = element
2018-04-04 18:23:45 +00:00
2018-10-09 19:52:41 +00:00
const id = page . getItemID ( element )
2018-12-18 17:01:28 +00:00
if ( isNaN ( id ) ) return
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
const selected = page . selected [ currentView ]
2018-12-18 17:01:28 +00:00
if ( ! selected . includes ( id ) && element . checked )
2018-10-09 19:52:41 +00:00
selected . push ( id )
2018-12-18 17:01:28 +00:00
else if ( selected . includes ( id ) && ! element . checked )
2018-10-09 19:52:41 +00:00
selected . splice ( selected . indexOf ( id ) , 1 )
2018-04-03 15:59:39 +00:00
2018-12-18 17:01:28 +00:00
if ( selected . length )
2018-10-09 19:52:41 +00:00
localStorage [ LS _KEYS . selected [ currentView ] ] = JSON . stringify ( selected )
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
localStorage . removeItem ( LS _KEYS . selected [ currentView ] )
page . selected [ currentView ] = selected
2018-03-29 23:22:08 +00:00
}
2018-07-14 03:42:18 +00:00
page . clearSelection = function ( ) {
2018-10-09 19:52:41 +00:00
const currentView = page . currentView
const selected = page . selected [ currentView ]
const count = selected . length
2018-12-18 17:01:28 +00:00
if ( ! count )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , ` You have not selected any ${ currentView } . ` , 'error' )
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
const suffix = count === 1 ? currentView . substring ( 0 , currentView . length - 1 ) : currentView
2018-07-14 03:42:18 +00:00
return swal ( {
2018-04-03 15:59:39 +00:00
title : 'Are you sure?' ,
2018-10-09 19:52:41 +00:00
text : ` You are going to unselect ${ count } ${ suffix } . ` ,
2018-04-03 15:59:39 +00:00
buttons : true
2018-10-09 19:52:41 +00:00
} ) . then ( function ( proceed ) {
2018-12-18 17:01:28 +00:00
if ( ! proceed ) return
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
const checkboxes = page . checkboxes [ currentView ]
2018-12-18 17:01:28 +00:00
for ( let i = 0 ; i < checkboxes . length ; i ++ )
if ( checkboxes [ i ] . checked )
2018-10-09 19:52:41 +00:00
checkboxes [ i ] . checked = false
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
localStorage . removeItem ( LS _KEYS . selected [ currentView ] )
page . selected [ currentView ] = [ ]
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
const selectAll = document . getElementById ( 'selectAll' )
2018-12-18 17:01:28 +00:00
if ( selectAll ) selectAll . checked = false
2018-04-03 15:59:39 +00:00
2018-10-09 19:52:41 +00:00
return swal ( 'Cleared selection!' , ` Unselected ${ count } ${ suffix } . ` , 'success' )
} )
2018-04-03 15:59:39 +00:00
}
2018-07-14 03:42:18 +00:00
page . deleteFile = function ( id ) {
2018-10-09 19:52:41 +00:00
// TODO: Share function with bulk delete, just like 'add selected uploads to album' and 'add single file to album'
2018-07-14 03:42:18 +00:00
swal ( {
2018-01-23 20:06:30 +00:00
title : 'Are you sure?' ,
2018-03-24 19:47:41 +00:00
text : 'You won\'t be able to recover the file!' ,
2018-03-19 16:51:39 +00:00
icon : 'warning' ,
dangerMode : true ,
buttons : {
cancel : true ,
confirm : {
text : 'Yes, delete it!' ,
closeModal : false
}
}
2018-10-09 19:52:41 +00:00
} ) . then ( function ( proceed ) {
2018-12-18 17:01:28 +00:00
if ( ! proceed ) return
2018-10-09 19:52:41 +00:00
axios . post ( 'api/upload/delete' , { id } ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( ! response ) return
2018-10-09 19:52:41 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
}
swal ( 'Deleted!' , 'The file has been deleted.' , 'success' )
page . getUploads ( page . views . uploads )
} ) . 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' )
2018-05-06 14:14:57 +00:00
} )
2018-10-09 19:52:41 +00:00
} )
2018-03-29 23:22:08 +00:00
}
2018-07-14 03:42:18 +00:00
page . deleteSelectedFiles = function ( ) {
2018-10-09 19:52:41 +00:00
const count = page . selected . uploads . length
2018-12-18 17:01:28 +00:00
if ( ! count )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'You have not selected any uploads.' , 'error' )
2018-03-29 23:22:08 +00:00
2018-10-09 19:52:41 +00:00
const suffix = ` file ${ count === 1 ? '' : 's' } `
2018-07-14 03:42:18 +00:00
swal ( {
2018-03-29 23:22:08 +00:00
title : 'Are you sure?' ,
2018-10-09 19:52:41 +00:00
text : ` You won't be able to recover ${ count } ${ suffix } ! ` ,
2018-03-29 23:22:08 +00:00
icon : 'warning' ,
dangerMode : true ,
buttons : {
cancel : true ,
confirm : {
2018-10-09 19:52:41 +00:00
text : ` Yes, nuke the ${ suffix } ! ` ,
2018-03-29 23:22:08 +00:00
closeModal : false
}
}
2018-10-09 19:52:41 +00:00
} ) . then ( function ( proceed ) {
2018-12-18 17:01:28 +00:00
if ( ! proceed ) return
2018-03-31 14:26:53 +00:00
2018-10-09 19:52:41 +00:00
axios . post ( 'api/upload/bulkdelete' , {
field : 'id' ,
values : page . selected . uploads
} ) . then ( function ( bulkdelete ) {
2018-12-18 17:01:28 +00:00
if ( ! bulkdelete ) return
2018-10-09 19:52:41 +00:00
2018-12-18 17:01:28 +00:00
if ( bulkdelete . data . success === false )
2018-10-09 19:52:41 +00:00
if ( bulkdelete . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , bulkdelete . data . description , 'error' )
}
let deleted = count
if ( bulkdelete . data . failed && bulkdelete . data . failed . length ) {
deleted -= bulkdelete . data . failed . length
page . selected . uploads = page . selected . uploads . filter ( function ( id ) {
return bulkdelete . data . failed . includes ( id )
2018-07-14 03:42:18 +00:00
} )
2018-12-18 17:41:42 +00:00
} else {
2018-10-09 19:52:41 +00:00
page . selected . uploads = [ ]
2018-12-18 17:41:42 +00:00
}
2018-10-09 19:52:41 +00:00
localStorage [ LS _KEYS . selected . uploads ] = JSON . stringify ( page . selected . uploads )
swal ( 'Deleted!' , ` ${ deleted } file ${ deleted === 1 ? ' has' : 's have' } been deleted. ` , 'success' )
return page . getUploads ( page . views . uploads )
} ) . catch ( function ( error ) {
console . log ( error )
swal ( 'An error occurred!' , 'There was an error with the request, please check the console for more information.' , 'error' )
2018-03-29 23:22:08 +00:00
} )
2018-10-09 19:52:41 +00:00
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . deleteByNames = function ( ) {
2018-10-09 19:52:41 +00:00
page . dom . innerHTML = `
< h2 class = "subtitle" > Delete by names < / h 2 >
< div class = "field" >
< label class = "label" > File names : < / l a b e l >
< div class = "control" >
< textarea id = "names" class = "textarea" > < / t e x t a r e a >
< / d i v >
< p class = "help" > Separate each entry with a new line . < / p >
< / d i v >
< div class = "field" >
< div class = "control" >
< a class = "button is-danger is-fullwidth" data - action = "delete-file-by-names" >
< span class = "icon" >
< i class = "icon-trash" > < / i >
< / s p a n >
< span > Bulk delete < / s p a n >
< / a >
< / d i v >
< / d i v >
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-05-05 19:44:58 +00:00
}
2018-07-14 03:42:18 +00:00
page . deleteFileByNames = function ( ) {
2018-10-09 19:52:41 +00:00
const names = document . getElementById ( 'names' ) . value
2018-07-14 03:42:18 +00:00
. split ( /\r?\n/ )
. filter ( function ( n ) {
return n . trim ( ) . length
} )
2018-10-09 19:52:41 +00:00
const count = names . length
2018-12-18 17:01:28 +00:00
if ( ! count )
2018-05-05 19:44:58 +00:00
return swal ( 'An error occurred!' , 'You have not entered any file names.' , 'error' )
2018-10-09 19:52:41 +00:00
const suffix = ` file ${ count === 1 ? '' : 's' } `
2018-07-14 03:42:18 +00:00
swal ( {
2018-05-05 19:44:58 +00:00
title : 'Are you sure?' ,
2018-10-09 19:52:41 +00:00
text : ` You won't be able to recover ${ count } ${ suffix } ! ` ,
2018-05-05 19:44:58 +00:00
icon : 'warning' ,
dangerMode : true ,
buttons : {
cancel : true ,
confirm : {
2018-10-09 19:52:41 +00:00
text : ` Yes, nuke the ${ suffix } ! ` ,
2018-05-05 19:44:58 +00:00
closeModal : false
}
}
2018-10-09 19:52:41 +00:00
} ) . then ( function ( proceed ) {
2018-12-18 17:01:28 +00:00
if ( ! proceed ) return
2018-05-05 19:44:58 +00:00
2018-10-09 19:52:41 +00:00
axios . post ( 'api/upload/bulkdelete' , {
field : 'name' ,
values : names
} ) . then ( function ( bulkdelete ) {
2018-12-18 17:01:28 +00:00
if ( ! bulkdelete ) return
2018-10-09 19:52:41 +00:00
2018-12-18 17:01:28 +00:00
if ( bulkdelete . data . success === false )
2018-10-09 19:52:41 +00:00
if ( bulkdelete . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , bulkdelete . data . description , 'error' )
}
let deleted = count
2018-12-18 17:01:28 +00:00
if ( bulkdelete . data . failed && bulkdelete . data . failed . length )
2018-10-09 19:52:41 +00:00
deleted -= bulkdelete . data . failed . length
document . getElementById ( 'names' ) . value = bulkdelete . data . failed . join ( '\n' )
swal ( 'Deleted!' , ` ${ deleted } file ${ deleted === 1 ? ' has' : 's have' } been deleted. ` , 'success' )
} ) . catch ( function ( error ) {
console . log ( error )
swal ( 'An error occurred!' , 'There was an error with the request, please check the console for more information.' , 'error' )
2018-05-05 19:44:58 +00:00
} )
2018-10-09 19:52:41 +00:00
} )
2018-05-05 19:44:58 +00:00
}
2018-07-14 03:42:18 +00:00
page . addSelectedFilesToAlbum = function ( ) {
2018-10-09 19:52:41 +00:00
const count = page . selected . uploads . length
2018-12-18 17:01:28 +00:00
if ( ! count )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'You have not selected any uploads.' , 'error' )
2018-03-30 02:39:53 +00:00
2018-10-09 19:52:41 +00:00
page . addFilesToAlbum ( page . selected . uploads , function ( failed ) {
2018-12-18 17:01:28 +00:00
if ( ! failed ) return
if ( failed . length )
2018-10-09 19:52:41 +00:00
page . selected . uploads = page . selected . uploads . filter ( function ( id ) {
2018-07-14 03:42:18 +00:00
return failed . includes ( id )
} )
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
page . selected . uploads = [ ]
2018-12-18 17:01:28 +00:00
2018-10-09 19:52:41 +00:00
localStorage [ LS _KEYS . selected . uploads ] = JSON . stringify ( page . selected . uploads )
page . getUploads ( page . views . uploads )
2018-07-14 03:42:18 +00:00
} )
2018-04-28 23:44:25 +00:00
}
2018-07-14 03:42:18 +00:00
page . addSingleFileToAlbum = function ( id ) {
page . addFilesToAlbum ( [ id ] , function ( failed ) {
2018-12-18 17:01:28 +00:00
if ( ! failed ) return
2018-10-09 19:52:41 +00:00
page . getUploads ( page . views . uploads )
2018-07-14 03:42:18 +00:00
} )
2018-03-30 02:39:53 +00:00
}
2018-07-14 03:42:18 +00:00
page . addFilesToAlbum = function ( ids , callback ) {
2018-10-09 19:52:41 +00:00
const count = ids . length
2018-09-26 11:57:33 +00:00
2018-10-09 19:52:41 +00:00
const content = document . createElement ( 'div' )
content . innerHTML = `
2018-10-18 13:26:40 +00:00
< div class = "field has-text-centered" >
< p > You are about to add < b > $ { count } < / b > f i l e $ { c o u n t = = = 1 ? ' ' : ' s ' } t o a n a l b u m . < / p >
< p > < b > If a file is already in an album , it will be moved . < / b > < / p >
< / d i v >
2018-10-09 19:52:41 +00:00
< div class = "field" >
< div class = "control" >
< div class = "select is-fullwidth" >
2018-10-10 17:33:11 +00:00
< select id = "swalAlbum" disabled >
2018-10-09 19:52:41 +00:00
< option value = "-1" > Remove from album < / o p t i o n >
< option value = "" selected disabled > Fetching albums list\u2026 < / o p t i o n >
< / s e l e c t >
< / d i v >
2018-10-10 17:33:11 +00:00
< / d i v >
2018-10-09 19:52:41 +00:00
< / d i v >
`
2018-09-26 11:57:33 +00:00
swal ( {
icon : 'warning' ,
2018-10-09 19:52:41 +00:00
content ,
2018-03-30 02:39:53 +00:00
buttons : {
cancel : true ,
confirm : {
2018-09-26 11:57:33 +00:00
text : 'OK' ,
2018-03-30 02:39:53 +00:00
closeModal : false
}
}
2018-09-26 11:57:33 +00:00
} ) . then ( function ( choose ) {
2018-12-18 17:01:28 +00:00
if ( ! choose ) return
2018-09-26 11:57:33 +00:00
2018-10-10 17:33:11 +00:00
const albumid = parseInt ( document . getElementById ( 'swalAlbum' ) . value )
2018-12-18 17:01:28 +00:00
if ( isNaN ( albumid ) )
2018-09-26 11:57:33 +00:00
return swal ( 'An error occurred!' , 'You did not choose an album.' , 'error' )
2018-07-14 03:42:18 +00:00
2018-09-26 11:57:33 +00:00
axios . post ( 'api/albums/addfiles' , {
2018-10-09 19:52:41 +00:00
ids ,
albumid
2018-09-26 11:57:33 +00:00
} ) . then ( function ( add ) {
2018-12-18 17:01:28 +00:00
if ( ! add ) return
2018-07-14 03:42:18 +00:00
2018-09-26 11:57:33 +00:00
if ( add . data . success === false ) {
2018-12-18 17:01:28 +00:00
if ( add . data . description === 'No token provided' )
2018-09-26 11:57:33 +00:00
page . verifyToken ( page . token )
2018-12-18 17:01:28 +00:00
else
2018-09-26 11:57:33 +00:00
swal ( 'An error occurred!' , add . data . description , 'error' )
2018-12-18 17:01:28 +00:00
2018-09-26 11:57:33 +00:00
return
}
2018-07-14 03:42:18 +00:00
2018-10-09 19:52:41 +00:00
let added = ids . length
2018-12-18 17:01:28 +00:00
if ( add . data . failed && add . data . failed . length )
2018-09-26 11:57:33 +00:00
added -= add . data . failed . length
2018-07-14 03:42:18 +00:00
2018-10-09 19:52:41 +00:00
const suffix = ` file ${ ids . length === 1 ? '' : 's' } `
2018-12-18 17:01:28 +00:00
if ( ! added )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , ` Could not add the ${ suffix } to the album. ` , 'error' )
2018-07-14 03:42:18 +00:00
2018-10-09 19:52:41 +00:00
swal ( 'Woohoo!' , ` Successfully ${ albumid < 0 ? 'removed' : 'added' } ${ added } ${ suffix } ${ albumid < 0 ? 'from' : 'to' } the album. ` , 'success' )
2018-09-26 11:57:33 +00:00
return callback ( add . data . failed )
} ) . 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' )
2018-03-30 02:39:53 +00:00
} )
2018-09-26 11:57:33 +00:00
} ) . 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' )
} )
// Get albums list then update content of swal
axios . get ( 'api/albums' ) . then ( function ( list ) {
if ( list . data . success === false ) {
2018-12-18 17:01:28 +00:00
if ( list . data . description === 'No token provided' )
2018-09-26 11:57:33 +00:00
page . verifyToken ( page . token )
2018-12-18 17:01:28 +00:00
else
2018-09-26 11:57:33 +00:00
swal ( 'An error occurred!' , list . data . description , 'error' )
2018-12-18 17:01:28 +00:00
2018-09-26 11:57:33 +00:00
return
}
2018-10-10 17:33:11 +00:00
const select = document . getElementById ( 'swalAlbum' )
2018-09-26 11:57:33 +00:00
// If the prompt was replaced, the container would be missing
2018-12-18 17:01:28 +00:00
if ( ! select ) return
2018-09-26 11:57:33 +00:00
select . innerHTML += list . data . albums
. map ( function ( album ) {
2018-10-09 19:52:41 +00:00
return ` <option value=" ${ album . id } "> ${ album . name } </option> `
2018-09-26 11:57:33 +00:00
} )
. join ( '\n' )
select . getElementsByTagName ( 'option' ) [ 1 ] . innerHTML = 'Choose an album'
select . removeAttribute ( 'disabled' )
} ) . 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' )
} )
2018-03-30 02:39:53 +00:00
}
2018-07-14 03:42:18 +00:00
page . getAlbums = function ( ) {
2018-10-09 19:52:41 +00:00
axios . get ( 'api/albums' ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( ! response ) return
2018-07-14 03:42:18 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
page . cache . albums = { }
page . dom . innerHTML = `
< h2 class = "subtitle" > Create new album < / h 2 >
< div class = "field" >
< div class = "control" >
< input id = "albumName" class = "input" type = "text" placeholder = "Name" >
< / d i v >
< / d i v >
2018-12-13 09:09:46 +00:00
< div class = "field" >
< div class = "control" >
< textarea id = "albumDescription" class = "textarea" placeholder = "Description" rows = "1" > < / t e x t a r e a >
< / d i v >
< / d i v >
2018-10-09 19:52:41 +00:00
< div class = "field" >
< div class = "control" >
< a id = "submitAlbum" class = "button is-breeze is-fullwidth" data - action = "submit-album" >
< span class = "icon" >
< i class = "icon-paper-plane-empty" > < / i >
< / s p a n >
< span > Create < / s p a n >
< / a >
< / d i v >
< / d i v >
< hr >
< h2 class = "subtitle" > List of albums < / h 2 >
< div class = "table-container" >
< table class = "table is-fullwidth is-hoverable" >
< thead >
< tr >
< th > ID < / t h >
< th > Name < / t h >
< th > Files < / t h >
< th > Created at < / t h >
< th > Public link < / t h >
< th > < / t h >
< / t r >
< / t h e a d >
< tbody id = "table" >
< / t b o d y >
< / t a b l e >
< / d i v >
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-10-09 19:52:41 +00:00
const homeDomain = response . data . homeDomain
const table = document . getElementById ( 'table' )
for ( let i = 0 ; i < response . data . albums . length ; i ++ ) {
const album = response . data . albums [ i ]
const albumUrl = ` ${ homeDomain } /a/ ${ album . identifier } `
// Prettify
album . prettyDate = page . getPrettyDate ( new Date ( album . timestamp * 1000 ) )
page . cache . albums [ album . id ] = {
name : album . name ,
download : album . download ,
2018-12-13 09:09:46 +00:00
public : album . public ,
description : album . description
2018-07-14 03:42:18 +00:00
}
2018-10-09 19:52:41 +00:00
const tr = document . createElement ( 'tr' )
tr . innerHTML = `
2018-10-12 10:19:14 +00:00
< th > $ { album . id } < / t h >
< th > $ { album . name } < / t h >
< th > $ { album . files } < / t h >
< td > $ { album . prettyDate } < / t d >
< td > < a $ { album . public ? ` href=" ${ albumUrl } " ` : 'class="is-linethrough"' } target = "_blank" rel = "noopener" > $ { albumUrl } < / a > < / t d >
< td style = "text-align: right" data - id = "${album.id}" >
< a class = "button is-small is-primary" title = "Edit album" data - action = "edit-album" >
< span class = "icon is-small" >
< i class = "icon-pencil-1" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-info clipboard-js" title = "Copy link to clipboard" $ { album . public ? ` data-clipboard-text=" ${ albumUrl } " ` : 'disabled' } >
< span class = "icon is-small" >
< i class = "icon-clipboard-1" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-warning" title = "Download album" $ { album . download ? ` href="api/album/zip/ ${ album . identifier } ?v= ${ album . editedAt } " ` : 'disabled' } >
< span class = "icon is-small" >
< i class = "icon-download" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-danger" title = "Delete album" data - action = "delete-album" >
< span class = "icon is-small" >
< i class = "icon-trash" > < / i >
< / s p a n >
< / a >
< / t d >
2018-10-09 19:52:41 +00:00
`
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' )
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . editAlbum = function ( id ) {
2018-10-09 19:52:41 +00:00
const album = page . cache . albums [ id ]
2018-12-18 17:01:28 +00:00
if ( ! album ) return
2018-04-28 17:26:39 +00:00
2018-10-09 19:52:41 +00:00
const div = document . createElement ( 'div' )
div . innerHTML = `
< div class = "field" >
< div class = "controls" >
2018-12-13 09:09:46 +00:00
< input id = "swalName" class = "input" type = "text" placeholder = "Name" value = "${album.name || ''}" >
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< textarea id = "swalDescription" class = "textarea" placeholder = "Description" rows = "2" > $ { album . description || '' } < / t e x t a r e a >
2018-10-09 19:52:41 +00:00
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< label class = "checkbox" >
< input id = "swalDownload" type = "checkbox" $ { album . download ? 'checked' : '' } >
Enable download
< / l a b e l >
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< label class = "checkbox" >
< input id = "swalPublic" type = "checkbox" $ { album . public ? 'checked' : '' } >
Enable public link
< / l a b e l >
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< label class = "checkbox" >
< input id = "swalRequestLink" type = "checkbox" >
Request new public link
< / l a b e l >
< / d i v >
< / d i v >
`
2018-09-04 15:49:37 +00:00
2018-07-14 03:42:18 +00:00
swal ( {
2018-04-28 17:26:39 +00:00
title : 'Edit album' ,
2018-03-19 16:51:39 +00:00
icon : 'info' ,
2018-04-28 17:26:39 +00:00
content : div ,
2018-03-19 16:51:39 +00:00
buttons : {
cancel : true ,
confirm : {
closeModal : false
}
2018-01-23 20:06:30 +00:00
}
2018-10-09 19:52:41 +00:00
} ) . then ( function ( value ) {
2018-12-18 17:01:28 +00:00
if ( ! value ) return
2018-10-09 19:52:41 +00:00
axios . post ( 'api/albums/edit' , {
id ,
name : document . getElementById ( 'swalName' ) . value ,
2018-12-13 09:09:46 +00:00
description : document . getElementById ( 'swalDescription' ) . value ,
2018-10-09 19:52:41 +00:00
download : document . getElementById ( 'swalDownload' ) . checked ,
public : document . getElementById ( 'swalPublic' ) . checked ,
requestLink : document . getElementById ( 'swalRequestLink' ) . checked
} ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( ! response ) return
2018-10-09 19:52:41 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
}
2018-12-18 17:01:28 +00:00
if ( response . data . identifier )
2018-10-09 19:52:41 +00:00
swal ( 'Success!' , ` Your album's new identifier is: ${ response . data . identifier } . ` , 'success' )
2018-12-18 17:01:28 +00:00
else if ( response . data . name !== album . name )
2018-10-09 19:52:41 +00:00
swal ( 'Success!' , ` Your album was renamed to: ${ response . data . name } . ` , 'success' )
2018-12-18 17:01:28 +00:00
else
2018-10-09 19:52:41 +00:00
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' )
2018-01-23 20:06:30 +00:00
} )
2018-10-09 19:52:41 +00:00
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . deleteAlbum = function ( id ) {
swal ( {
2018-01-23 20:06:30 +00:00
title : 'Are you sure?' ,
2018-10-09 19:52:41 +00:00
text : 'This won\'t delete your uploads, only the album!' ,
2018-03-19 16:51:39 +00:00
icon : 'warning' ,
dangerMode : true ,
buttons : {
cancel : true ,
confirm : {
text : 'Yes, delete it!' ,
closeModal : false
2018-03-30 02:39:53 +00:00
} ,
purge : {
2018-10-09 19:52:41 +00:00
text : 'Umm, delete the uploads too please?' ,
2018-03-30 02:39:53 +00:00
value : 'purge' ,
className : 'swal-button--danger' ,
closeModal : false
2018-03-19 16:51:39 +00:00
}
}
2018-10-09 19:52:41 +00:00
} ) . then ( function ( proceed ) {
2018-12-18 17:01:28 +00:00
if ( ! proceed ) return
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
axios . post ( 'api/albums/delete' , {
id ,
purge : proceed === 'purge'
} ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-07-14 03:42:18 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
}
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
swal ( 'Deleted!' , 'Your album has been deleted.' , 'success' )
2018-07-14 03:42:18 +00:00
page . getAlbumsSidebar ( )
page . getAlbums ( )
2018-10-09 19:52:41 +00:00
} ) . catch ( function ( error ) {
2018-03-29 23:22:08 +00:00
console . log ( error )
2018-03-30 02:39:53 +00:00
return swal ( 'An error occurred!' , 'There was an error with the request, please check the console for more information.' , 'error' )
2018-03-19 16:51:39 +00:00
} )
2018-10-09 19:52:41 +00:00
} )
}
page . submitAlbum = function ( element ) {
page . isLoading ( element , true )
axios . post ( 'api/albums' , {
2018-12-13 09:09:46 +00:00
name : document . getElementById ( 'albumName' ) . value ,
description : document . getElementById ( 'albumDescription' ) . value
2018-10-09 19:52:41 +00:00
} ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( ! response ) return
2018-10-09 19:52:41 +00:00
page . isLoading ( element , false )
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
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' )
} )
2018-07-14 03:42:18 +00:00
}
2018-05-06 14:14:57 +00:00
2018-07-14 03:42:18 +00:00
page . getAlbumsSidebar = function ( ) {
2018-10-09 19:52:41 +00:00
axios . get ( 'api/albums/sidebar' ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( ! response ) return
2018-07-14 03:42:18 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
const albumsContainer = document . getElementById ( 'albumsContainer' )
albumsContainer . innerHTML = ''
2018-05-06 14:14:57 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . albums === undefined ) return
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
for ( let i = 0 ; i < response . data . albums . length ; i ++ ) {
const album = response . data . albums [ i ]
const li = document . createElement ( 'li' )
const a = document . createElement ( 'a' )
a . id = album . id
a . innerHTML = album . name
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
a . addEventListener ( 'click' , function ( ) {
page . getAlbum ( this )
} )
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
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' )
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . getAlbum = function ( album ) {
2018-04-29 12:47:24 +00:00
page . setActiveMenu ( album )
2018-10-13 19:35:46 +00:00
page . getUploads ( { album : album . id } )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . changeFileLength = function ( ) {
2018-10-09 19:52:41 +00:00
axios . get ( 'api/filelength/config' ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-05-06 14:14:57 +00:00
2018-10-09 19:52:41 +00:00
// Shorter vars
const { max , min } = response . data . config
2018-10-12 10:28:42 +00:00
const [ chg , def ] = [ response . data . config . userChangeable , response . data . config . default ]
2018-10-09 19:52:41 +00:00
const len = response . data . fileLength
page . dom . innerHTML = `
< h2 class = "subtitle" > File name length < / h 2 >
< div class = "field" >
< div class = "field" >
< label class = "label" > Your current file name length : < / l a b e l >
< div class = "control" >
< input id = "fileLength" class = "input" type = "text" placeholder = "Your file length" value = "${len ? Math.min(Math.max(len, min), max) : def}" >
< / d i v >
< p class = "help" > Default file name length is < b > $ { def } < / b > c h a r a c t e r s . $ { ( c h g ? ` R a n g e a l l o w e d f o r u s e r i s < b > $ { m i n } < / b > t o < b > $ { m a x } < / b > c h a r a c t e r s . ` : ' C h a n g i n g f i l e n a m e l e n g t h i s d i s a b l e d a t t h e m o m e n t . ' ) } < / p >
< / d i v >
< div class = "field" >
< div class = "control" >
< a id = "setFileLength" class = "button is-breeze is-fullwidth" >
< span class = "icon" >
< i class = "icon-paper-plane-empty" > < / i >
< / s p a n >
< span > Set file name length < / s p a n >
< / a >
< / d i v >
< div >
< / d i v >
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-10-09 19:52:41 +00:00
document . getElementById ( 'setFileLength' ) . addEventListener ( 'click' , function ( ) {
page . setFileLength ( document . getElementById ( 'fileLength' ) . value , this )
2018-03-24 13:52:47 +00:00
} )
2018-10-09 19:52:41 +00:00
} ) . 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' )
} )
2018-07-14 03:42:18 +00:00
}
2018-01-23 20:06:30 +00:00
2018-07-14 03:42:18 +00:00
page . setFileLength = function ( fileLength , element ) {
page . isLoading ( element , true )
2018-03-19 16:51:39 +00:00
2018-10-09 19:52:41 +00:00
axios . post ( 'api/filelength/change' , { fileLength } ) . then ( function ( response ) {
page . isLoading ( element , false )
2018-05-05 19:44:58 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
swal ( {
title : 'Woohoo!' ,
text : 'Your file length was successfully changed.' ,
icon : 'success'
} ) . then ( function ( ) {
page . changeFileLength ( )
2018-01-23 20:06:30 +00:00
} )
2018-10-09 19:52:41 +00:00
} ) . 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' )
} )
2018-07-14 03:42:18 +00:00
}
2018-05-06 14:14:57 +00:00
2018-07-14 03:42:18 +00:00
page . changeToken = function ( ) {
2018-10-09 19:52:41 +00:00
axios . get ( 'api/tokens' ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-10-09 19:52:41 +00:00
page . dom . innerHTML = `
< h2 class = "subtitle" > Manage your token < / h 2 >
< div class = "field" >
< label class = "label" > Your current token : < / l a b e l >
< div class = "field" >
< div class = "control" >
< input id = "token" readonly class = "input" type = "text" placeholder = "Your token" value = "${response.data.token}" >
< / d i v >
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< a id = "getNewToken" class = "button is-breeze is-fullwidth" data - action = "get-new-token" >
< span class = "icon" >
< i class = "icon-arrows-cw" > < / i >
< / s p a n >
< span > Request new token < / s p a n >
< / a >
< / d i v >
< / d i v >
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-10-09 19:52:41 +00:00
} ) . 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' )
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . getNewToken = function ( element ) {
2018-04-29 12:47:24 +00:00
page . isLoading ( element , true )
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
axios . post ( 'api/tokens/change' ) . then ( function ( response ) {
page . isLoading ( element , false )
2018-07-14 03:42:18 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-10-09 19:52:41 +00:00
swal ( {
title : 'Woohoo!' ,
text : 'Your token was successfully changed.' ,
icon : 'success'
} ) . then ( function ( ) {
axios . defaults . headers . common . token = response . data . token
localStorage [ LS _KEYS . token ] = response . data . token
page . token = response . data . token
page . changeToken ( )
2018-01-23 20:06:30 +00:00
} )
2018-10-09 19:52:41 +00:00
} ) . 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' )
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . changePassword = function ( ) {
2018-10-09 19:52:41 +00:00
page . dom . innerHTML = `
< h2 class = "subtitle" > Change your password < / h 2 >
< div class = "field" >
< label class = "label" > New password : < / l a b e l >
< div class = "control" >
< input id = "password" class = "input" type = "password" >
< / d i v >
< / d i v >
< div class = "field" >
< label class = "label" > Re - type new password : < / l a b e l >
< div class = "control" >
< input id = "passwordConfirm" class = "input" type = "password" >
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< a id = "sendChangePassword" class = "button is-breeze is-fullwidth" >
< span class = "icon" >
< i class = "icon-paper-plane-empty" > < / i >
< / s p a n >
< span > Set new password < / s p a n >
< / a >
< / d i v >
< / d i v >
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-01-23 20:06:30 +00:00
document . getElementById ( 'sendChangePassword' ) . addEventListener ( 'click' , function ( ) {
2018-12-18 17:01:28 +00:00
if ( document . getElementById ( 'password' ) . value === document . getElementById ( 'passwordConfirm' ) . value )
2018-04-29 12:47:24 +00:00
page . sendNewPassword ( document . getElementById ( 'password' ) . value , this )
2018-12-18 17:01:28 +00:00
else
2018-01-23 20:06:30 +00:00
swal ( {
title : 'Password mismatch!' ,
text : 'Your passwords do not match, please try again.' ,
2018-03-19 16:51:39 +00:00
icon : 'error'
2018-01-23 20:06:30 +00:00
} )
} )
}
2018-07-14 03:42:18 +00:00
page . sendNewPassword = function ( pass , element ) {
2018-04-29 12:47:24 +00:00
page . isLoading ( element , true )
2018-01-23 20:06:30 +00:00
2018-10-09 19:52:41 +00:00
axios . post ( 'api/password/change' , { password : pass } ) . then ( function ( response ) {
page . isLoading ( element , false )
2018-07-14 03:42:18 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
if ( response . data . description === 'No token provided' ) {
return page . verifyToken ( page . token )
} else {
return swal ( 'An error occurred!' , response . data . description , 'error' )
2018-07-14 03:42:18 +00:00
}
2018-10-09 19:52:41 +00:00
swal ( {
title : 'Woohoo!' ,
text : 'Your password was successfully changed.' ,
icon : 'success'
} ) . then ( function ( ) {
page . changePassword ( )
2018-01-23 20:06:30 +00:00
} )
2018-10-09 19:52:41 +00:00
} ) . 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' )
} )
2018-01-23 20:06:30 +00:00
}
2018-07-14 03:42:18 +00:00
page . setActiveMenu = function ( activeItem ) {
2018-10-09 19:52:41 +00:00
const menu = document . getElementById ( 'menu' )
const items = menu . getElementsByTagName ( 'a' )
2018-12-18 17:01:28 +00:00
for ( let i = 0 ; i < items . length ; i ++ )
2018-07-14 04:35:31 +00:00
items [ i ] . classList . remove ( 'is-active' )
2018-01-23 20:06:30 +00:00
2018-05-01 14:41:25 +00:00
activeItem . classList . add ( 'is-active' )
2018-01-23 20:06:30 +00:00
}
2018-10-08 18:54:16 +00:00
page . getPrettyDate = date => {
return date . getFullYear ( ) + '-' +
( date . getMonth ( ) < 9 ? '0' : '' ) + // month's index starts from zero
( date . getMonth ( ) + 1 ) + '-' +
( date . getDate ( ) < 10 ? '0' : '' ) +
date . getDate ( ) + ' ' +
( date . getHours ( ) < 10 ? '0' : '' ) +
date . getHours ( ) + ':' +
( date . getMinutes ( ) < 10 ? '0' : '' ) +
date . getMinutes ( ) + ':' +
( date . getSeconds ( ) < 10 ? '0' : '' ) +
date . getSeconds ( )
}
page . getPrettyBytes = num => {
// MIT License
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
2018-12-13 09:09:46 +00:00
2018-12-18 17:01:28 +00:00
if ( ! Number . isFinite ( num ) ) return num
2018-10-08 18:54:16 +00:00
const neg = num < 0
2018-12-18 17:01:28 +00:00
if ( neg ) num = - num
if ( num < 1 ) return ` ${ neg ? '-' : '' } ${ num } B `
2018-10-08 18:54:16 +00:00
const exponent = Math . min ( Math . floor ( Math . log10 ( num ) / 3 ) , page . byteUnits . length - 1 )
const numStr = Number ( ( num / Math . pow ( 1000 , exponent ) ) . toPrecision ( 3 ) )
const unit = page . byteUnits [ exponent ]
2018-10-09 19:52:41 +00:00
return ` ${ neg ? '-' : '' } ${ numStr } ${ unit } `
}
page . getUsers = ( { pageNum } = { } , element ) => {
2018-12-18 17:01:28 +00:00
if ( element ) page . isLoading ( element , true )
if ( pageNum === undefined ) pageNum = 0
2018-10-09 19:52:41 +00:00
2018-12-18 17:01:28 +00:00
if ( ! page . permissions . admin )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'You can not do this!' , 'error' )
const url = ` api/users/ ${ pageNum } `
axios . get ( url ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
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 . users . length === 0 ) ) {
// Only remove loading class here, since beyond this the entire page will be replaced anyways
2018-12-18 17:01:28 +00:00
if ( element ) page . isLoading ( element , false )
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , 'There are no more users!' , 'error' )
}
page . currentView = 'users'
page . cache . users = { }
const pagination = `
< nav class = "pagination is-centered" >
< a class = "button pagination-previous" data - action = "page-prev" > Previous < / a >
< a class = "button pagination-next" data - action = "page-next" > Next page < / a >
< / n a v >
`
const controls = `
< div class = "columns" >
< div class = "column is-hidden-mobile" > < / d i v >
< div class = "column" style = "text-align: right" >
< a class = "button is-small is-info" title = "Clear selection" data - action = "clear-selection" >
< span class = "icon" >
< i class = "icon-cancel" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-warning" title = "Bulk disable (WIP)" data - action = "bulk-disable-users" disabled >
< span class = "icon" >
< i class = "icon-hammer" > < / i >
< / s p a n >
< span > Bulk disable < / s p a n >
< / a >
< a class = "button is-small is-danger" title = "Bulk delete (WIP)" data - action = "bulk-delete-users" disabled >
< span class = "icon" >
< i class = "icon-trash" > < / i >
< / s p a n >
< span > Bulk delete < / s p a n >
< / a >
< / d i v >
< / d i v >
`
let allSelected = true
page . dom . innerHTML = `
$ { pagination }
< hr >
$ { controls }
< div class = "table-container" >
< table class = "table is-narrow is-fullwidth is-hoverable" >
< thead >
< tr >
< th > < input id = "selectAll" class = "checkbox" type = "checkbox" title = "Select all users" data - action = "select-all" > < / t h >
2018-10-12 09:42:16 +00:00
< th > ID < / t h >
< th style = "width: 25%" > Username < / t h >
< th > Uploads < / t h >
2018-10-12 10:19:14 +00:00
< th > Usage < / t h >
2018-10-09 19:52:41 +00:00
< th > File length < / t h >
< th > Group < / t h >
< th > < / t h >
< / t r >
< / t h e a d >
< tbody id = "table" >
< / t b o d y >
< / t a b l e >
< / d i v >
< hr >
$ { pagination }
`
2018-12-04 11:58:53 +00:00
page . fadeIn ( )
2018-10-09 19:52:41 +00:00
const table = document . getElementById ( 'table' )
for ( let i = 0 ; i < response . data . users . length ; i ++ ) {
const user = response . data . users [ i ]
const selected = page . selected . users . includes ( user . id )
2018-12-18 17:01:28 +00:00
if ( ! selected && allSelected ) allSelected = false
2018-10-09 19:52:41 +00:00
2018-10-10 17:33:11 +00:00
let displayGroup = null
for ( const group of Object . keys ( user . groups ) ) {
2018-12-18 17:01:28 +00:00
if ( ! user . groups [ group ] ) break
2018-10-10 17:33:11 +00:00
displayGroup = group
}
2018-10-12 09:42:16 +00:00
// Server-side explicitly expects either of these two values to consider a user as disabled
const enabled = user . enabled !== false && user . enabled !== 0
2018-10-09 19:52:41 +00:00
page . cache . users [ user . id ] = {
username : user . username ,
groups : user . groups ,
2018-10-12 09:42:16 +00:00
enabled ,
2018-10-10 17:33:11 +00:00
displayGroup
2018-10-09 19:52:41 +00:00
}
const tr = document . createElement ( 'tr' )
tr . dataset . id = user . id
tr . innerHTML = `
2018-10-12 10:19:14 +00:00
< td class = "controls" > < input type = "checkbox" class = "checkbox" title = "Select this user" data - action = "select" $ { selected ? ' checked' : '' } > < / t d >
2018-10-12 09:42:16 +00:00
< th > $ { user . id } < / t h >
2018-10-12 10:19:14 +00:00
< th$ { enabled ? '' : ' class="is-linethrough"' } > $ { user . username } < / t d >
2018-10-12 09:42:16 +00:00
< th > $ { user . uploadsCount } < / t h >
2018-10-12 10:19:14 +00:00
< td > $ { page . getPrettyBytes ( user . diskUsage ) } < / t d >
2018-10-09 19:52:41 +00:00
< td > $ { user . fileLength || 'default' } < / t d >
2018-10-10 17:33:11 +00:00
< td > $ { displayGroup } < / t d >
2018-10-09 19:52:41 +00:00
< td class = "controls" style = "text-align: right" >
< a class = "button is-small is-primary" title = "Edit user" data - action = "edit-user" >
< span class = "icon" >
< i class = "icon-pencil-1" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-warning" title = "Disable user (WIP)" data - action = "disable-user" disabled >
< span class = "icon" >
< i class = "icon-hammer" > < / i >
< / s p a n >
< / a >
< a class = "button is-small is-danger" title = "Delete user (WIP)" data - action = "delete-user" disabled >
< span class = "icon" >
< i class = "icon-trash" > < / i >
< / s p a n >
< / a >
< / t d >
`
table . appendChild ( tr )
// page.checkboxes.users = Array.from(table.getElementsByClassName('checkbox'))
page . checkboxes . users = Array . from ( table . querySelectorAll ( '.checkbox[data-action="select"]' ) )
}
if ( allSelected && response . data . users . length ) {
const selectAll = document . getElementById ( 'selectAll' )
2018-12-18 17:01:28 +00:00
if ( selectAll ) selectAll . checked = true
2018-10-09 19:52:41 +00:00
}
page . views . users . pageNum = response . data . users . length ? pageNum : 0
} ) . catch ( function ( error ) {
2018-12-18 17:01:28 +00:00
if ( element ) page . isLoading ( element , false )
2018-10-09 19:52:41 +00:00
console . log ( error )
return swal ( 'An error occurred!' , 'There was an error with the request, please check the console for more information.' , 'error' )
} )
}
page . editUser = function ( id ) {
const user = page . cache . users [ id ]
2018-12-18 17:01:28 +00:00
if ( ! user ) return
2018-10-09 19:52:41 +00:00
2018-10-10 17:33:11 +00:00
const groupOptions = Object . keys ( page . permissions ) . map ( ( g , i , a ) => {
const selected = g === user . displayGroup
const disabled = ! ( a [ i + 1 ] && page . permissions [ a [ i + 1 ] ] )
return ` <option value=" ${ g } " ${ selected ? ' selected' : '' } ${ disabled ? ' disabled' : '' } > ${ g } </option> `
} ) . join ( '\n' )
2018-10-09 19:52:41 +00:00
const div = document . createElement ( 'div' )
div . innerHTML = `
< div class = "field" >
< label class = "label" > Username < / l a b e l >
< div class = "controls" >
< input id = "swalUsername" class = "input" type = "text" value = "${user.username || ''}" >
< / d i v >
< / d i v >
2018-10-10 17:33:11 +00:00
< div class = "field" >
< label class = "label" > User group < / l a b e l >
< div class = "control" >
< div class = "select is-fullwidth" >
< select id = "swalGroup" >
$ { groupOptions }
< / s e l e c t >
< / d i v >
< / d i v >
< / d i v >
2018-10-09 19:52:41 +00:00
< div class = "field" >
< div class = "control" >
< label class = "checkbox" >
< input id = "swalEnabled" type = "checkbox" $ { user . enabled ? 'checked' : '' } >
Enabled
< / l a b e l >
< / d i v >
< / d i v >
< div class = "field" >
< div class = "control" >
< label class = "checkbox" >
< input id = "swalResetPassword" type = "checkbox" >
Reset password
< / l a b e l >
< / d i v >
< / d i v >
`
swal ( {
title : 'Edit user' ,
icon : 'info' ,
content : div ,
buttons : {
cancel : true ,
confirm : {
closeModal : false
}
}
} ) . then ( function ( value ) {
2018-12-18 17:01:28 +00:00
if ( ! value ) return
2018-10-09 19:52:41 +00:00
axios . post ( 'api/users/edit' , {
id ,
username : document . getElementById ( 'swalUsername' ) . value ,
2018-10-10 17:33:11 +00:00
group : document . getElementById ( 'swalGroup' ) . value ,
2018-10-09 19:52:41 +00:00
enabled : document . getElementById ( 'swalEnabled' ) . checked ,
resetPassword : document . getElementById ( 'swalResetPassword' ) . checked
} ) . then ( function ( response ) {
2018-12-18 17:01:28 +00:00
if ( ! response ) return
2018-10-09 19:52:41 +00:00
2018-12-18 17:01:28 +00:00
if ( response . data . success === false )
2018-10-09 19:52:41 +00:00
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 . password ) {
const div = document . createElement ( 'div' )
div . innerHTML = `
< p > $ { user . username } ' s new password is : < / p >
< p class = "is-code" > $ { response . data . password } < / p >
`
swal ( {
title : 'Success!' ,
icon : 'success' ,
content : div
} )
2018-12-18 17:41:42 +00:00
} else if ( response . data . name !== user . name ) {
2018-10-09 19:52:41 +00:00
swal ( 'Success!' , ` ${ user . username } was renamed into: ${ response . data . name } . ` , 'success' )
2018-12-18 17:41:42 +00:00
} else {
2018-10-09 19:52:41 +00:00
swal ( 'Success!' , 'The user was edited!' , 'success' )
2018-12-18 17:41:42 +00:00
}
2018-10-09 19:52:41 +00:00
page . getUsers ( page . views . users )
} ) . 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 . disableUser = function ( id ) {
swal ( {
title : 'Are you sure?' ,
text : ` You will be disabling a user with the username <b> ${ page . cache . users . id . username } !</b> ` ,
icon : 'warning' ,
dangerMode : true ,
buttons : {
cancel : true ,
confirm : {
text : 'Yes, disable them!' ,
closeModal : false
}
}
} ) . then ( function ( proceed ) {
2018-12-18 17:41:42 +00:00
if ( ! proceed ) return
2018-10-09 19:52:41 +00:00
axios . post ( 'api/users/disable' , { id } ) . then ( function ( response ) {
2018-12-18 17:41:42 +00:00
if ( ! response ) return
2018-10-09 19:52:41 +00:00
if ( response . data . success === false ) {
2018-12-18 17:41:42 +00:00
if ( response . data . description === 'No token provided' )
2018-10-09 19:52:41 +00:00
return page . verifyToken ( page . token )
2018-12-18 17:41:42 +00:00
else
2018-10-09 19:52:41 +00:00
return swal ( 'An error occurred!' , response . data . description , 'error' )
}
swal ( 'Success!' , 'The user has been disabled.' , 'success' )
page . getUsers ( page . views . users )
} ) . 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' )
} )
} )
2018-10-08 18:54:16 +00:00
}
2018-10-09 19:52:41 +00:00
* /
2018-10-08 18:54:16 +00:00
2018-07-14 03:42:18 +00:00
window . onload = function ( ) {
2018-03-28 11:36:28 +00:00
// Add 'no-touch' class to non-touch devices
2018-12-18 17:01:28 +00:00
if ( ! ( 'ontouchstart' in document . documentElement ) )
2018-05-01 14:41:25 +00:00
document . documentElement . classList . add ( 'no-touch' )
2018-03-28 20:05:01 +00:00
2018-10-09 19:52:41 +00:00
const selectedKeys = [ 'uploads' , 'users' ]
for ( const selectedKey of selectedKeys ) {
const ls = localStorage [ LS _KEYS . selected [ selectedKey ] ]
2018-12-18 17:01:28 +00:00
if ( ls ) page . selected [ selectedKey ] = JSON . parse ( ls )
2018-03-29 23:22:08 +00:00
}
2018-04-29 12:47:24 +00:00
page . preparePage ( )
2018-03-28 20:05:01 +00:00
2018-04-29 12:47:24 +00:00
page . clipboardJS = new ClipboardJS ( '.clipboard-js' )
2018-03-28 20:05:01 +00:00
2018-07-14 03:42:18 +00:00
page . clipboardJS . on ( 'success' , function ( ) {
2018-03-28 20:05:01 +00:00
return swal ( 'Copied!' , 'The link has been copied to clipboard.' , 'success' )
} )
2018-07-14 03:42:18 +00:00
page . clipboardJS . on ( 'error' , function ( event ) {
2018-03-28 20:05:01 +00:00
console . error ( event )
2018-03-30 02:39:53 +00:00
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' )
2018-03-28 20:05:01 +00:00
} )
2018-04-29 12:47:24 +00:00
page . lazyLoad = new LazyLoad ( )
2018-01-23 20:06:30 +00:00
}