feat: add directory size calculation (#16)

* feat: add directory size calculation

* feat: add dir disk usage button

* feat: add dir size button
pull/3756/head
Laurynas Gadliauskas 2021-07-27 09:42:03 +03:00 committed by GitHub
parent ea2ef9a03b
commit 34bcd7dfc8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 83 additions and 4 deletions

View File

@ -36,7 +36,14 @@
</p> </p>
<p v-else class="name">{{ name }}</p> <p v-else class="name">{{ name }}</p>
<p v-if="isDir" class="size" data-order="-1">&mdash;</p> <p v-if="isDir && !diskUsage" class="size" data-order="-1">&mdash;</p>
<p
v-else-if="isDir && diskUsage"
class="size"
:data-order="humanDiskUsage()"
>
{{ humanDiskUsage() }}
</p>
<p v-else class="size" :data-order="humanSize()">{{ humanSize() }}</p> <p v-else class="size" :data-order="humanSize()">{{ humanSize() }}</p>
<p class="modified"> <p class="modified">
@ -61,6 +68,7 @@ export default {
name: "item", name: "item",
data: function () { data: function () {
return { return {
diskUsage: null,
touches: 0, touches: 0,
}; };
}, },
@ -78,7 +86,7 @@ export default {
"readOnly", "readOnly",
], ],
computed: { computed: {
...mapState(["user", "selected", "req", "jwt"]), ...mapState(["user", "selected", "req", "jwt", "diskUsages"]),
...mapGetters(["selectedCount"]), ...mapGetters(["selectedCount"]),
singleClick() { singleClick() {
return this.readOnly == undefined && this.user.singleClick; return this.readOnly == undefined && this.user.singleClick;
@ -119,8 +127,14 @@ export default {
return enableThumbs; return enableThumbs;
}, },
}, },
watch: {
diskUsages() {
this.fetchDiskUsage();
},
},
mounted() { mounted() {
this.$refs.item.addEventListener("contextmenu", this.contextMenu); this.$refs.item.addEventListener("contextmenu", this.contextMenu);
this.fetchDiskUsage();
}, },
beforeDestroy() { beforeDestroy() {
this.$refs.item.removeEventListener("contextmenu", this.contextMenu); this.$refs.item.removeEventListener("contextmenu", this.contextMenu);
@ -133,6 +147,12 @@ export default {
"showContextMenu", "showContextMenu",
"hideContextMenu", "hideContextMenu",
]), ]),
fetchDiskUsage() {
if (this.isDir) {
this.diskUsage =
this.diskUsages[this.req.items[this.index].path] || null;
}
},
permissions() { permissions() {
let s = ""; let s = "";
if (this.isSymlink) { if (this.isSymlink) {
@ -153,6 +173,9 @@ export default {
s += (this.mode & 1) != 0 ? "x" : "-"; s += (this.mode & 1) != 0 ? "x" : "-";
return s; return s;
}, },
humanDiskUsage: function () {
return filesize(this.diskUsage);
},
humanSize: function () { humanSize: function () {
return filesize(this.size); return filesize(this.size);
}, },

View File

@ -11,11 +11,11 @@
<div class="card-action full"> <div class="card-action full">
<div @click="uploadFile" class="action"> <div @click="uploadFile" class="action">
<i class="material-icons">insert_drive_file</i> <i class="material-icons">insert_drive_file</i>
<div class="title">File</div> <div class="title">{{ $t("prompts.uploadFile") }}</div>
</div> </div>
<div @click="uploadFolder" class="action"> <div @click="uploadFolder" class="action">
<i class="material-icons">folder</i> <i class="material-icons">folder</i>
<div class="title">Folder</div> <div class="title">{{ $t("prompts.uploadFolder") }}</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -9,6 +9,7 @@
"create": "Create", "create": "Create",
"delete": "Delete", "delete": "Delete",
"download": "Download", "download": "Download",
"directorySizes": "Calculate directory sizes",
"hideDotfiles": "Hide dotfiles", "hideDotfiles": "Hide dotfiles",
"info": "Info", "info": "Info",
"more": "More", "more": "More",
@ -170,6 +171,8 @@
"unsavedChanges": "Changes that you made may not be saved. Leave page?", "unsavedChanges": "Changes that you made may not be saved. Leave page?",
"upload": "Upload", "upload": "Upload",
"uploadMessage": "Select an option to upload.", "uploadMessage": "Select an option to upload.",
"uploadFile": "File",
"uploadFolder": "Folder",
"write": "Write" "write": "Write"
}, },
"search": { "search": {

View File

@ -25,6 +25,7 @@ const state = {
showShell: false, showShell: false,
showConfirm: null, showConfirm: null,
contextMenu: null, contextMenu: null,
diskUsages: {},
}; };
export default new Vuex.Store({ export default new Vuex.Store({

View File

@ -91,6 +91,16 @@ const mutations = {
hideContextMenu: (state) => { hideContextMenu: (state) => {
state.contextMenu = null; state.contextMenu = null;
}, },
addDiskUsage: (state, value) => {
if (value.path[value.path.length - 1] == "/") {
value.path = value.path.slice(0, -1);
}
let tmp = state.diskUsages;
state.diskUsages = null;
tmp[value.path] = value.usage;
state.diskUsages = tmp;
},
}; };
export default mutations; export default mutations;

View File

@ -92,6 +92,12 @@
:label="$t('buttons.upload')" :label="$t('buttons.upload')"
@action="upload" @action="upload"
/> />
<action
icon="assessment"
id="dir_size-button"
:label="$t('buttons.directorySizes')"
@action="calculateDirSizes"
/>
<action icon="info" :label="$t('buttons.info')" show="info" /> <action icon="info" :label="$t('buttons.info')" show="info" />
<action <action
icon="check_circle" icon="check_circle"
@ -293,6 +299,7 @@ import { enableExec } from "@/utils/constants";
import * as upload from "@/utils/upload"; import * as upload from "@/utils/upload";
import css from "@/utils/css"; import css from "@/utils/css";
import throttle from "lodash.throttle"; import throttle from "lodash.throttle";
import buttons from "@/utils/buttons";
import HeaderBar from "@/components/header/HeaderBar"; import HeaderBar from "@/components/header/HeaderBar";
import Action from "@/components/header/Action"; import Action from "@/components/header/Action";
@ -838,6 +845,41 @@ export default {
}, },
}); });
}, },
calculateDirSizes() {
let links = [];
if (this.selectedCount === 0) {
for (let item of this.req.items) {
if (item.isDir) {
links.push(item.url);
}
}
} else {
for (let selected of this.selected) {
if (this.req.items[selected].isDir) {
links.push(this.req.items[selected].url);
}
}
}
let promises = [];
for (let link of links) {
promises.push(api.diskUsage(link));
}
buttons.loading("dir_size");
Promise.allSettled(promises).then((results) => {
for (let result of results) {
if (result.status === "fulfilled") {
this.$store.commit("addDiskUsage", {
path: result.value.path,
usage: result.value.diskUsage,
});
}
}
buttons.success("dir_size");
});
},
switchView: async function () { switchView: async function () {
this.$store.commit("closeHovers"); this.$store.commit("closeHovers");