2018-02-01 12:17:04 +00:00
|
|
|
<template>
|
2021-03-21 11:51:58 +00:00
|
|
|
<div id="search" @click="open" v-bind:class="{ active, ongoing }">
|
2018-02-01 12:17:04 +00:00
|
|
|
<div id="input">
|
2023-07-17 05:17:52 +00:00
|
|
|
<button v-if="active" class="action" @click="close" :aria-label="$t('buttons.close')" :title="$t('buttons.close')">
|
2018-02-01 12:17:04 +00:00
|
|
|
<i class="material-icons">arrow_back</i>
|
|
|
|
</button>
|
|
|
|
<i v-else class="material-icons">search</i>
|
2023-07-17 05:17:52 +00:00
|
|
|
<input type="text" @keyup.exact="keyup" @input="submit" ref="input" :autofocus="active" v-model.trim="value"
|
|
|
|
:aria-label="$t('search.search')" :placeholder="$t('search.search')" />
|
2018-02-01 12:17:04 +00:00
|
|
|
</div>
|
|
|
|
|
2019-01-06 10:06:08 +00:00
|
|
|
<div id="result" ref="result">
|
2023-07-13 02:23:29 +00:00
|
|
|
<div id="result-list">
|
|
|
|
<br>
|
|
|
|
<br>
|
2023-07-17 05:17:52 +00:00
|
|
|
<div class="button" style="width:100%">Search Context: {{ getContext(this.$route.path) }}</div>
|
2019-01-05 16:12:09 +00:00
|
|
|
<template v-if="isEmpty">
|
2018-02-01 12:17:04 +00:00
|
|
|
<p>{{ text }}</p>
|
|
|
|
<template v-if="value.length === 0">
|
|
|
|
<div class="boxes">
|
2021-03-21 11:51:58 +00:00
|
|
|
<h3>{{ $t("search.types") }}</h3>
|
2018-02-01 12:17:04 +00:00
|
|
|
<div>
|
2023-07-17 05:17:52 +00:00
|
|
|
<div tabindex="0" v-for="(v, k) in boxes" :key="k" role="button" @click="init('type:' + k)"
|
|
|
|
:aria-label="(v.label)">
|
2021-03-21 11:51:58 +00:00
|
|
|
<i class="material-icons">{{ v.icon }}</i>
|
2023-07-17 05:17:52 +00:00
|
|
|
<p>{{ v.label }}</p>
|
2018-02-01 12:17:04 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</template>
|
2023-07-17 05:17:52 +00:00
|
|
|
<ul v-show="results.length > 0">
|
|
|
|
<li v-for="(s, k) in results" :key="k" @click.stop.prevent="navigateTo(s.url)" style="cursor: pointer">
|
|
|
|
<router-link to="#" event="">
|
|
|
|
<i v-if="s.dir" class="material-icons folder-icons"> folder </i>
|
|
|
|
<i v-else-if="s.audio" class="material-icons audio-icons"> volume_up </i>
|
|
|
|
<i v-else-if="s.image" class="material-icons image-icons"> photo </i>
|
|
|
|
<i v-else-if="s.video" class="material-icons video-icons"> movie </i>
|
|
|
|
<i v-else-if="s.archive" class="material-icons archive-icons"> archive </i>
|
|
|
|
<i v-else class="material-icons file-icons"> insert_drive_file </i>
|
|
|
|
<span class="text-container">
|
|
|
|
{{ basePath(s.path) }}<b>{{ baseName(s.path) }}</b>
|
|
|
|
</span>
|
2018-02-01 12:17:04 +00:00
|
|
|
</router-link>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
2021-03-21 11:51:58 +00:00
|
|
|
import { mapState, mapGetters, mapMutations } from "vuex";
|
|
|
|
import { search } from "@/api";
|
2019-01-05 16:12:09 +00:00
|
|
|
|
2018-07-29 19:07:49 +00:00
|
|
|
var boxes = {
|
2023-07-17 05:17:52 +00:00
|
|
|
folder: { label: "folders", icon: "folder" },
|
|
|
|
file: { label: "files", icon: "insert_drive_file" },
|
|
|
|
archive: { label: "archives", icon: "archive" },
|
|
|
|
image: { label: "images", icon: "photo" },
|
|
|
|
audio: { label: "audio files", icon: "volume_up" },
|
|
|
|
video: { label: "videos", icon: "movie" },
|
|
|
|
doc: { label: "documents", icon: "picture_as_pdf" },
|
2023-07-21 22:41:24 +00:00
|
|
|
"larger=100": { label: "larger than 100MB", icon: "arrow_forward_ios" },
|
|
|
|
"smaller=100": { label: "smaller than 100MB ", icon: "arrow_back_ios" },
|
2021-03-21 11:51:58 +00:00
|
|
|
};
|
2018-07-29 19:07:49 +00:00
|
|
|
|
2018-02-01 12:17:04 +00:00
|
|
|
export default {
|
2019-01-05 16:12:09 +00:00
|
|
|
name: "search",
|
2021-03-21 11:51:58 +00:00
|
|
|
data: function () {
|
2018-02-01 12:17:04 +00:00
|
|
|
return {
|
2019-01-05 16:12:09 +00:00
|
|
|
value: "",
|
2018-02-01 12:17:04 +00:00
|
|
|
active: false,
|
|
|
|
ongoing: false,
|
2019-01-05 16:12:09 +00:00
|
|
|
results: [],
|
2018-07-23 13:48:55 +00:00
|
|
|
reload: false,
|
2021-03-21 11:51:58 +00:00
|
|
|
scrollable: null,
|
|
|
|
};
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
|
|
|
watch: {
|
2021-03-21 11:51:58 +00:00
|
|
|
show(val, old) {
|
|
|
|
this.active = val === "search";
|
2019-01-05 16:12:09 +00:00
|
|
|
if (old === "search" && !this.active) {
|
2018-02-01 12:17:04 +00:00
|
|
|
if (this.reload) {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.setReload(true);
|
2018-02-01 12:17:04 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 11:51:58 +00:00
|
|
|
document.body.style.overflow = "auto";
|
|
|
|
this.reset();
|
|
|
|
this.value = "";
|
|
|
|
this.active = false;
|
|
|
|
this.$refs.input.blur();
|
2019-01-05 16:12:09 +00:00
|
|
|
} else if (this.active) {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.reload = false;
|
|
|
|
this.$refs.input.focus();
|
|
|
|
document.body.style.overflow = "hidden";
|
2018-02-01 12:17:04 +00:00
|
|
|
}
|
2019-01-06 10:06:08 +00:00
|
|
|
},
|
2021-03-21 11:51:58 +00:00
|
|
|
value() {
|
2019-01-06 10:06:08 +00:00
|
|
|
if (this.results.length) {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.reset();
|
2019-01-06 10:06:08 +00:00
|
|
|
}
|
2021-03-21 11:51:58 +00:00
|
|
|
},
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
|
|
|
computed: {
|
2019-01-05 16:12:09 +00:00
|
|
|
...mapState(["user", "show"]),
|
|
|
|
...mapGetters(["isListing"]),
|
|
|
|
boxes() {
|
2021-03-21 11:51:58 +00:00
|
|
|
return boxes;
|
2019-01-05 16:12:09 +00:00
|
|
|
},
|
|
|
|
isEmpty() {
|
2021-03-21 11:51:58 +00:00
|
|
|
return this.results.length === 0;
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2019-01-05 16:12:09 +00:00
|
|
|
text() {
|
2018-02-01 12:17:04 +00:00
|
|
|
if (this.ongoing) {
|
2021-03-21 11:51:58 +00:00
|
|
|
return "";
|
2018-02-01 12:17:04 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 11:51:58 +00:00
|
|
|
return this.value === ""
|
|
|
|
? this.$t("search.typeToSearch")
|
|
|
|
: this.$t("search.pressToSearch");
|
|
|
|
},
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2019-01-05 16:12:09 +00:00
|
|
|
mounted() {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.$refs.result.addEventListener("scroll", (event) => {
|
|
|
|
if (
|
|
|
|
event.target.offsetHeight + event.target.scrollTop >=
|
|
|
|
event.target.scrollHeight - 100
|
|
|
|
) {
|
|
|
|
this.resultsCount += 50;
|
2019-01-06 10:06:08 +00:00
|
|
|
}
|
2021-03-21 11:51:58 +00:00
|
|
|
});
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
|
|
|
methods: {
|
2023-07-17 05:17:52 +00:00
|
|
|
async navigateTo(url) {
|
|
|
|
this.closeHovers();
|
|
|
|
await this.$nextTick();
|
|
|
|
setTimeout(() => this.$router.push(url), 0);
|
|
|
|
},
|
|
|
|
getContext(url) {
|
|
|
|
url = url.slice(1)
|
|
|
|
let path = "./" + url.substring(url.indexOf('/') + 1);
|
|
|
|
return path.replace(/\/+$/, '') + "/"
|
|
|
|
},
|
|
|
|
basePath(str) {
|
2023-07-21 22:41:24 +00:00
|
|
|
if (!str.includes("/")){
|
|
|
|
return ""
|
|
|
|
}
|
2023-07-17 05:17:52 +00:00
|
|
|
let parts = str.replace(/\/$/, '').split("/")
|
|
|
|
parts.pop()
|
|
|
|
return parts.join("/") + "/"
|
|
|
|
},
|
|
|
|
baseName(str) {
|
2023-07-21 22:41:24 +00:00
|
|
|
let parts = str.split("/")
|
|
|
|
if (str.endsWith("/")) {
|
|
|
|
return parts[parts.length - 2] + "/"
|
|
|
|
} else {
|
|
|
|
return parts[parts.length - 1]
|
|
|
|
}
|
2023-07-17 05:17:52 +00:00
|
|
|
},
|
2019-01-05 16:12:09 +00:00
|
|
|
...mapMutations(["showHover", "closeHovers", "setReload"]),
|
|
|
|
open() {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.showHover("search");
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2019-01-05 16:12:09 +00:00
|
|
|
close(event) {
|
2021-03-21 11:51:58 +00:00
|
|
|
event.stopPropagation();
|
|
|
|
this.closeHovers();
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2019-01-05 16:12:09 +00:00
|
|
|
keyup(event) {
|
|
|
|
if (event.keyCode === 27) {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.close(event);
|
|
|
|
return;
|
2018-02-01 12:17:04 +00:00
|
|
|
}
|
2023-06-16 17:29:43 +00:00
|
|
|
this.results.length === 0;
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2021-03-21 11:51:58 +00:00
|
|
|
init(string) {
|
|
|
|
this.value = `${string} `;
|
|
|
|
this.$refs.input.focus();
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2021-03-21 11:51:58 +00:00
|
|
|
reset() {
|
|
|
|
this.ongoing = false;
|
|
|
|
this.resultsCount = 50;
|
|
|
|
this.results = [];
|
2018-02-01 12:17:04 +00:00
|
|
|
},
|
2019-01-05 16:12:09 +00:00
|
|
|
async submit(event) {
|
2021-03-21 11:51:58 +00:00
|
|
|
event.preventDefault();
|
2023-07-21 22:41:24 +00:00
|
|
|
const words = this.value.split(" ").filter(word => word.length < 3);
|
|
|
|
if (this.value === "" || words.length > 0) {
|
2021-03-21 11:51:58 +00:00
|
|
|
return;
|
2018-02-01 12:17:04 +00:00
|
|
|
}
|
2021-03-21 11:51:58 +00:00
|
|
|
let path = this.$route.path;
|
|
|
|
this.ongoing = true;
|
2020-09-29 14:04:43 +00:00
|
|
|
try {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.results = await search(path, this.value);
|
2020-09-29 14:04:43 +00:00
|
|
|
} catch (error) {
|
2021-03-21 11:51:58 +00:00
|
|
|
this.$showError(error);
|
2020-09-29 14:04:43 +00:00
|
|
|
}
|
2019-01-06 10:06:08 +00:00
|
|
|
|
2021-03-21 11:51:58 +00:00
|
|
|
this.ongoing = false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
2018-02-01 12:17:04 +00:00
|
|
|
</script>
|