You've already forked filebrowser
mirror of
https://github.com/filebrowser/filebrowser.git
synced 2025-11-26 14:25:26 +08:00
Former-commit-id: 4aab1964b9462d1fdee92999dd5a7d03f17b4457 [formerly 22352202547980b191886cf29f68ce8e9cc4c39b] [formerly 1a66bae34022092936c2912ea3a323a6984fe7e4 [formerly 1e7c4e6468]]
Former-commit-id: 94170b15369b05e8f4985e88242ba453b5545116 [formerly 2a0b57bebcd48c0189974f4f9e72679b5c67f37b]
Former-commit-id: 635be5ad2826c1659670997900122d024a46de24
125 lines
3.2 KiB
Vue
125 lines
3.2 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">—</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'
|
|
|
|
var $ = window.info
|
|
|
|
export default {
|
|
name: 'item',
|
|
props: ['name', 'isDir', 'url', 'type', 'size', 'modified', 'index'],
|
|
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)
|
|
})
|
|
|
|
$.selected = []
|
|
return false
|
|
},
|
|
click: function (event) {
|
|
if ($.selected.length !== 0) event.preventDefault()
|
|
if ($.selected.indexOf(this.index) === -1) {
|
|
if (!event.ctrlKey && !$.multiple) this.unselectAll()
|
|
|
|
this.$el.setAttribute('aria-selected', true)
|
|
$.selected.push(this.index)
|
|
} else {
|
|
this.$el.setAttribute('aria-selected', false)
|
|
$.selected = array.remove($.selected, this.index)
|
|
}
|
|
|
|
// this.handleSelectionChange()
|
|
return false
|
|
},
|
|
open: function (event) {
|
|
page.open(this.url)
|
|
}
|
|
}
|
|
}
|
|
</script>
|