feat: add directory size calculation (#16)
* feat: add directory size calculation * feat: add dir disk usage button * feat: add dir size buttonpull/3756/head
parent
ea2ef9a03b
commit
34bcd7dfc8
|
@ -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">—</p>
|
<p v-if="isDir && !diskUsage" class="size" data-order="-1">—</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);
|
||||||
},
|
},
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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({
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue