filebrowser/_assets/_old/js/listing.js

360 lines
9.9 KiB
JavaScript
Raw Normal View History

2017-06-25 08:11:25 +00:00
'use strict'
var listing = {
2017-06-26 16:53:29 +00:00
selectMultiple: false,
reload: function (callback) {
let request = new window.XMLHttpRequest()
request.open('GET', window.location)
request.setRequestHeader('Minimal', 'true')
request.send()
request.onreadystatechange = function () {
if (request.readyState === 4) {
if (request.status === 200) {
document.querySelector('body main').innerHTML = request.responseText
listing.addDoubleTapEvent()
if (typeof callback === 'function') {
callback()
}
2017-06-25 08:11:25 +00:00
}
}
}
2017-06-26 16:53:29 +00:00
},
rename: function (event) {
if (!selectedItems.length || selectedItems.length > 1) {
return false
2017-06-25 08:11:25 +00:00
}
2017-06-26 16:53:29 +00:00
let item = document.getElementById(selectedItems[0])
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
if (item.classList.contains('disabled')) {
return false
}
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
let link = item.dataset.url
let field = item.querySelector('.name')
let name = field.innerHTML
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
let submit = (event) => {
event.preventDefault()
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
let newName = event.currentTarget.querySelector('input').value
let newLink = removeLastDirectoryPartOf(link) + '/' + newName
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
closePrompt(event)
buttons.setLoading('rename')
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
webdav.move(link, newLink).then(() => {
listing.reload(() => {
newName = btoa(newName)
selectedItems = [newName]
document.getElementById(newName).setAttribute('aria-selected', true)
listing.handleSelectionChange()
})
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
buttons.setDone('rename')
}).catch(error => {
field.innerHTML = name
buttons.setDone('rename', false)
console.log(error)
2017-06-25 08:11:25 +00:00
})
2017-06-26 16:53:29 +00:00
return false
}
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
let clone = document.importNode(templates.question.content, true)
clone.querySelector('h3').innerHTML = 'Rename'
clone.querySelector('input').value = name
clone.querySelector('.ok').innerHTML = 'Rename'
clone.querySelector('form').addEventListener('submit', submit)
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
document.querySelector('body').appendChild(clone)
document.querySelector('.overlay').classList.add('active')
document.querySelector('.prompt').classList.add('active')
2017-06-25 08:11:25 +00:00
2017-06-26 16:53:29 +00:00
return false
},
handleFiles: function (files, base) {
2017-06-25 08:11:25 +00:00
}
}
listing.redefineDownloadURLs = function () {
let files = ''
for (let i = 0; i < selectedItems.length; i++) {
let url = document.getElementById(selectedItems[i]).dataset.url
files += url.replace(window.location.pathname, '') + ','
}
files = files.substring(0, files.length - 1)
files = encodeURIComponent(files)
let links = document.querySelectorAll('#download ul a')
Array.from(links).forEach(link => {
link.href = '?download=' + link.dataset.format + '&files=' + files
})
}
listing.newFileButton = function (event) {
event.preventDefault()
let clone = document.importNode(templates.question.content, true)
clone.querySelector('h3').innerHTML = 'New file'
clone.querySelector('p').innerHTML = 'End with a trailing slash to create a dir.'
clone.querySelector('.ok').innerHTML = 'Create'
clone.querySelector('form').addEventListener('submit', listing.newFilePrompt)
document.querySelector('body').appendChild(clone)
document.querySelector('.overlay').classList.add('active')
document.querySelector('.prompt').classList.add('active')
}
listing.newFilePrompt = function (event) {
event.preventDefault()
buttons.setLoading('new')
let name = event.currentTarget.querySelector('input').value
webdav.new(window.location.pathname + name)
.then(() => {
buttons.setDone('new')
listing.reload()
})
.catch(e => {
console.log(e)
buttons.setDone('new', false)
})
closePrompt(event)
return false
}
listing.addDoubleTapEvent = function () {
let items = document.getElementsByClassName('item'),
touches = {
id: '',
count: 0
}
Array.from(items).forEach(file => {
file.addEventListener('touchstart', event => {
if (touches.id != file.id) {
touches.id = file.id
touches.count = 1
setTimeout(() => {
touches.count = 0
}, 300)
return
}
touches.count++
if (touches.count > 1) {
window.location = file.dataset.url
}
})
})
}
listing.selectMoveFolder = function (event) {
if (event.target.getAttribute('aria-selected') === 'true') {
event.target.setAttribute('aria-selected', false)
return
} else {
if (document.querySelector('.file-list li[aria-selected=true]')) {
document.querySelector('.file-list li[aria-selected=true]').setAttribute('aria-selected', false)
}
event.target.setAttribute('aria-selected', true)
return
}
}
listing.getJSON = function (link) {
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest()
request.open('GET', link)
request.setRequestHeader('Accept', 'application/json')
request.onload = () => {
if (request.status == 200) {
resolve(request.responseText)
} else {
reject(request.statusText)
}
}
request.onerror = () => reject(request.statusText)
request.send()
})
}
listing.moveMakeItem = function (url, name) {
let node = document.createElement('li'),
count = 0
node.dataset.url = url
node.innerHTML = name
node.setAttribute('aria-selected', false)
node.addEventListener('dblclick', listing.moveDialogNext)
node.addEventListener('click', listing.selectMoveFolder)
node.addEventListener('touchstart', event => {
count++
setTimeout(() => {
count = 0
}, 300)
if (count > 1) {
listing.moveDialogNext(event)
}
})
return node
}
listing.moveDialogNext = function (event) {
let request = new XMLHttpRequest(),
prompt = document.querySelector('form.prompt.active'),
list = prompt.querySelector('div.file-list ul')
prompt.addEventListener('submit', listing.moveSelected)
listing.getJSON(event.target.dataset.url)
.then((data) => {
let dirs = 0
prompt.querySelector('ul').innerHTML = ''
prompt.querySelector('code').innerHTML = event.target.dataset.url
if (event.target.dataset.url != baseURL + '/') {
let node = listing.moveMakeItem(removeLastDirectoryPartOf(event.target.dataset.url) + '/', '..')
list.appendChild(node)
}
if (JSON.parse(data) == null) {
prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.`
return
}
for (let f of JSON.parse(data)) {
if (f.IsDir === true) {
dirs++
list.appendChild(listing.moveMakeItem(f.URL, f.Name))
}
}
if (dirs === 0)
prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.`
})
.catch(e => console.log(e))
}
listing.moveSelected = function (event) {
event.preventDefault()
let promises = []
buttons.setLoading('move')
for (let file of selectedItems) {
let fileElement = document.getElementById(file),
destFolder = event.target.querySelector('p code').innerHTML
if (event.currentTarget.querySelector('li[aria-selected=true]') != null) {
destFolder = event.currentTarget.querySelector('li[aria-selected=true]').dataset.url
}
let destPath = '/' + destFolder + '/' + fileElement.querySelector('.name').innerHTML
destPath = destPath.replace('//', '/')
promises.push(webdav.move(fileElement.dataset.url, destPath))
}
Promise.all(promises)
.then(() => {
closePrompt(event)
buttons.setDone('move')
listing.reload()
})
.catch(e => {
console.log(e)
})
}
listing.moveEvent = function (event) {
if (event.currentTarget.classList.contains('disabled'))
return
listing.getJSON(window.location.pathname)
.then((data) => {
let prompt = document.importNode(templates.move.content, true),
list = prompt.querySelector('div.file-list ul'),
dirs = 0
prompt.querySelector('form').addEventListener('submit', listing.moveSelected)
prompt.querySelector('code').innerHTML = window.location.pathname
if (window.location.pathname !== baseURL + '/') {
list.appendChild(listing.moveMakeItem(removeLastDirectoryPartOf(window.location.pathname) + '/', '..'))
}
for (let f of JSON.parse(data)) {
if (f.IsDir === true) {
dirs++
list.appendChild(listing.moveMakeItem(f.URL, f.Name))
}
}
if (dirs === 0) {
prompt.querySelector('p').innerHTML = `There aren't any folders in this directory.`
}
document.body.appendChild(prompt)
document.querySelector('.overlay').classList.add('active')
document.querySelector('.prompt').classList.add('active')
})
.catch(e => console.log(e))
}
document.addEventListener('DOMContentLoaded', event => {
listing.updateColumns()
listing.addDoubleTapEvent()
buttons.rename = document.getElementById('rename')
buttons.upload = document.getElementById('upload')
buttons.new = document.getElementById('new')
buttons.download = document.getElementById('download')
buttons.move = document.getElementById('move')
document.getElementById('multiple-selection-activate').addEventListener('click', event => {
listing.selectMultiple = true
clickOverlay.click()
document.getElementById('multiple-selection').classList.add('active')
document.querySelector('body').style.paddingBottom = '4em'
})
document.getElementById('multiple-selection-cancel').addEventListener('click', event => {
listing.selectMultiple = false
document.querySelector('body').style.paddingBottom = '0'
document.getElementById('multiple-selection').classList.remove('active')
})
if (user.AllowEdit) {
buttons.move.addEventListener('click', listing.moveEvent)
buttons.rename.addEventListener('click', listing.rename)
}
let items = document.getElementsByClassName('item')
if (user.AllowNew) {
buttons.upload.addEventListener('click', (event) => {
document.getElementById('upload-input').click()
})
2017-06-28 15:05:30 +00:00
buttons.new.addEventListener('click', listing.newFileButton)
2017-06-25 08:11:25 +00:00
}
})