Files
filebrowser/_assets/src/components/Search.vue
T

132 lines
3.5 KiB
Vue
Raw Normal View History

2017-06-28 11:45:41 +01:00
<template>
2017-06-30 15:02:45 +01:00
<div id="search" v-on:mouseleave="hover = false" v-on:click="click" v-bind:class="{ active: focus || hover, ongoing }">
<i class="material-icons" title="Search">search</i>
<input type="text"
v-model.trim="value"
v-on:focus="focus = true"
v-on:blur="focus = false"
v-on:keyup="keyup"
v-on:keyup.enter="submit"
2017-06-30 16:04:01 +01:00
aria-label="Write here to search"
2017-06-30 15:02:45 +01:00
:placeholder="placeholder()">
<div v-on:mouseover="hover = true">
<div>
<span v-if="search.length === 0 && commands.length === 0">{{ text() }}</span>
<ul v-else-if="search.length > 0">
2017-07-03 18:07:14 +01:00
<li v-for="s in search"><router-link :to="'./' + s">./{{ s }}</router-link></li>
2017-06-30 15:02:45 +01:00
</ul>
<ul v-else-if="commands.length > 0">
<li v-for="c in commands">{{ c }}</li>
</ul>
</div>
<p><i class="material-icons spin">autorenew</i></p>
2017-06-28 11:45:41 +01:00
</div>
2017-06-30 15:02:45 +01:00
</div>
2017-06-28 11:45:41 +01:00
</template>
<script>
2017-06-30 12:43:43 +01:00
import { mapState } from 'vuex'
2017-07-03 15:19:17 +01:00
import url from '@/utils/url'
2017-07-03 18:07:14 +01:00
import api from '@/utils/api'
2017-06-28 11:45:41 +01:00
export default {
name: 'search',
data: function () {
return {
2017-06-30 15:02:45 +01:00
value: '',
2017-06-28 11:45:41 +01:00
hover: false,
focus: false,
2017-06-30 15:02:45 +01:00
ongoing: false,
2017-06-28 11:45:41 +01:00
scrollable: null,
2017-06-30 15:02:45 +01:00
search: [],
commands: []
2017-06-28 11:45:41 +01:00
}
2017-06-27 19:00:58 +01:00
},
2017-06-30 15:02:45 +01:00
computed: mapState(['user']),
2017-06-27 19:00:58 +01:00
mounted: function () {
this.scrollable = document.querySelector('#search > div')
},
methods: {
2017-06-30 15:02:45 +01:00
placeholder: function () {
2017-06-30 12:43:43 +01:00
if (this.user.allowCommands && this.user.commands.length > 0) {
2017-06-30 15:02:45 +01:00
return 'Search or execute a command...'
}
return 'Search...'
},
text: function () {
if (this.value.length === 0) {
if (this.user.allowCommands && this.user.commands.length > 0) {
return `Search or use one of your supported commands: ${this.user.commands.join(', ')}.`
}
return 'Type and press enter to search.'
}
if (!this.supported() || !this.user.allowCommands) {
return 'Press enter to search.'
2017-06-27 19:00:58 +01:00
} else {
2017-06-30 15:02:45 +01:00
return 'Press enter to execute.'
2017-06-27 19:00:58 +01:00
}
},
2017-06-30 15:02:45 +01:00
keyup: function () {
this.search.length = 0
this.commands.length = 0
},
2017-06-27 19:00:58 +01:00
supported: function () {
2017-06-30 15:02:45 +01:00
let pieces = this.value.split(' ')
2017-06-27 19:00:58 +01:00
2017-06-30 12:43:43 +01:00
for (let i = 0; i < this.user.commands.length; i++) {
if (pieces[0] === this.user.commands[0]) {
2017-06-27 19:00:58 +01:00
return true
}
}
return false
},
click: function (event) {
event.currentTarget.classList.add('active')
this.$el.querySelector('input').focus()
},
submit: function (event) {
2017-06-30 15:02:45 +01:00
this.ongoing = true
2017-06-27 19:00:58 +01:00
2017-07-03 18:07:14 +01:00
let path = this.$route.path
2017-06-30 15:02:45 +01:00
if (this.$store.state.req.kind !== 'listing') {
2017-07-03 18:07:14 +01:00
path = url.removeLastDir(path) + '/'
2017-06-27 19:00:58 +01:00
}
2017-06-30 12:43:43 +01:00
if (this.supported() && this.user.allowCommands) {
2017-07-03 18:07:14 +01:00
api.command(path, this.value,
(event) => {
this.commands.push(event.data)
this.scrollable.scrollTop = this.scrollable.scrollHeight
},
(event) => {
this.ongoing = false
this.scrollable.scrollTop = this.scrollable.scrollHeight
this.$store.commit('setReload', true)
}
)
2017-06-27 19:00:58 +01:00
2017-07-03 18:07:14 +01:00
return
}
2017-06-27 19:00:58 +01:00
2017-07-03 18:07:14 +01:00
api.search(path, this.value,
(event) => {
let url = event.data
if (url[0] === '/') url = url.substring(1)
2017-06-27 19:00:58 +01:00
2017-07-03 18:07:14 +01:00
this.search.push(url)
this.scrollable.scrollTop = this.scrollable.scrollHeight
},
(event) => {
2017-06-30 15:02:45 +01:00
this.ongoing = false
this.scrollable.scrollTop = this.scrollable.scrollHeight
2017-06-27 19:00:58 +01:00
}
2017-07-03 18:07:14 +01:00
)
2017-06-27 19:00:58 +01:00
}
}
2017-06-28 11:45:41 +01:00
}
</script>