Henrique Dias 346412eb2a Improvements :)
Former-commit-id: c1c1881302a241fdc7140e6aabeb9b49977bd7c6 [formerly 84bb454c2f34baffd9dfa91645b8aff149e52620] [formerly 29e258c7a16db1ca8a3fde7c5e4e3cffc47899a6 [formerly 84ddad027fed623021092d56872ff138bc5ea416]]
Former-commit-id: 0018a51df5bc801b783a3ffe17d9f33c504ce094 [formerly 0072c425cd4754e38f30007ab9f5272ea4b40370]
Former-commit-id: d298f006e58ef9e4987def4bc354818062b30fcd
2017-06-28 22:20:28 +01:00

126 lines
3.3 KiB
Vue

<template>
<div class="item"
draggable="true"
@dragstart="dragStart"
@dragover="dragOver"
@drop="drop"
@click="click"
@dblclick="open"
:id="base64()">
<div>
<i class="material-icons">{{ icon() }}</i>
</div>
<div>
<p class="name">{{ name }}</p>
<p v-if="isDir" class="size" data-order="-1">&mdash;</p>
<p v-else class="size" :data-order="humanSize()">{{ humanSize() }}</p>
<p class="modified">
<time :datetime="modified">{{ humanTime() }}</time>
</p>
</div>
</div>
</template>
<script>
import filesize from 'filesize'
import moment from 'moment'
import webdav from '../webdav.js'
import page from '../page.js'
import array from '../array.js'
export default {
name: 'item',
props: ['name', 'isDir', 'url', 'type', 'size', 'modified', 'index'],
data: function () {
return window.info.listing
},
methods: {
icon: function () {
if (this.isDir) return 'folder'
if (this.type === 'image') return 'insert_photo'
if (this.type === 'audio') return 'volume_up'
if (this.type === 'video') return 'movie'
return 'insert_drive_file'
},
humanSize: function () {
return filesize(this.size)
},
humanTime: function () {
return moment(this.modified).fromNow()
},
base64: function () {
return window.btoa(this.name)
},
dragStart: function (event) {
let el = event.target
for (let i = 0; i < 5; i++) {
if (!el.classList.contains('item')) {
el = el.parentElement
}
}
event.dataTransfer.setData('name', el.querySelector('.name').innerHTML)
event.dataTransfer.setData('obj-url', this.url)
},
dragOver: function (event) {
if (!this.isDir) return
event.preventDefault()
let el = event.target
for (let i = 0; i < 5; i++) {
if (!el.classList.contains('item')) {
el = el.parentElement
}
}
el.style.opacity = 1
},
drop: function (event) {
if (!this.isDir) return
event.preventDefault()
let url = event.dataTransfer.getData('obj-url')
let name = event.dataTransfer.getData('name')
if (name === '' || url === '' || url === this.url) return
webdav.move(url, this.url + name)
.then(() => page.reload())
.catch(error => console.log(error))
},
unselectAll: function () {
let items = document.getElementsByClassName('item')
Array.from(items).forEach(link => {
link.setAttribute('aria-selected', false)
})
this.selected.length = 0
return false
},
click: function (event) {
if (this.selected.length !== 0) event.preventDefault()
if (this.selected.indexOf(this.index) === -1) {
if (!event.ctrlKey && !this.multiple) this.unselectAll()
this.$el.setAttribute('aria-selected', true)
this.selected.push(this.index)
} else {
this.$el.setAttribute('aria-selected', false)
this.selected = array.remove(this.selected, this.index)
}
// this.handleSelectionChange()
return false
},
open: function (event) {
page.open(this.url)
}
}
}
</script>