diff --git a/dashboard/src/components/DiskUsage.vue b/dashboard/src/components/DiskUsage.vue
new file mode 100644
index 000000000..834a615d0
--- /dev/null
+++ b/dashboard/src/components/DiskUsage.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+ Last updated: {{ prettyDate(lastUpdated) }}
+
+
+
+
+
+
+
+
+
+
{{ $t('system.diskUsage.notAvailableYet') }}
+
+
+
+
{{ prettyDecimalSize(disk.available) }}
+
+
{{ $t('system.diskUsage.diskSpeed', { speed: disk.speed }) }}
+
+
{{ $t('system.diskUsage.diskContent') }}:
+
+
+
{{ content.path }} (Old Backups)
+
{{ content.label }}
+
{{ content.label }}
+
+ {{ content.label }}
+ {{ $t('system.diskUsage.uninstalledApp') }}
+
+
{{ content.label }}
+
{{ prettyDecimalSize(content.usage) }}
+
+
+
+
+
+
+
diff --git a/dashboard/src/components/ExternalLdap.vue b/dashboard/src/components/ExternalLdap.vue
index 9b42cfee4..c17d24e73 100644
--- a/dashboard/src/components/ExternalLdap.vue
+++ b/dashboard/src/components/ExternalLdap.vue
@@ -186,7 +186,7 @@ async function updateTaskStatus(id) {
syncPercent.value = result.percent;
syncMessage.value = result.message;
- setTimeout(updateTaskStatus.bind(null, id), 500);
+ setTimeout(updateTaskStatus.bind(null, id), 2000);
}
async function refreshTasks() {
diff --git a/dashboard/src/models/SystemModel.js b/dashboard/src/models/SystemModel.js
index a1800cd5a..9d2987b03 100644
--- a/dashboard/src/models/SystemModel.js
+++ b/dashboard/src/models/SystemModel.js
@@ -61,6 +61,28 @@ function create() {
if (error || result.status !== 202) return [error || result];
return [null];
},
+ async diskUsage() {
+ let error, result;
+ try {
+ result = await fetcher.get(`${origin}/api/v1/system/disk_usage`, { access_token: accessToken });
+ } catch (e) {
+ error = e;
+ }
+
+ if (error || result.status !== 200) return [error || result];
+ return [null, result.body.usage];
+ },
+ async rescanDiskUsage() {
+ let error, result;
+ try {
+ result = await fetcher.post(`${origin}/api/v1/system/disk_usage`, {}, { access_token: accessToken });
+ } catch (e) {
+ error = e;
+ }
+
+ if (error || result.status !== 201) return [error || result];
+ return [null, result.body.taskId];
+ },
};
}
diff --git a/dashboard/src/models/VolumesModel.js b/dashboard/src/models/VolumesModel.js
index 78fa1b00d..7ef3b2dbc 100644
--- a/dashboard/src/models/VolumesModel.js
+++ b/dashboard/src/models/VolumesModel.js
@@ -6,21 +6,17 @@ function create() {
const origin = import.meta.env.VITE_API_ORIGIN || window.location.origin;
return {
- name: 'VolumesModel',
async list() {
- let error, result;
+ let result;
try {
result = await fetcher.get(`${origin}/api/v1/volumes`, { access_token: accessToken });
} catch (e) {
- error = e;
+ return [e];
}
- if (error || result.status !== 200) {
- console.error('Failed to list volumes.', error, result);
- return [];
- }
+ if (result.status !== 200) return [result];
- return result.body.volumes;
+ return [null, result.body.volumes];
},
async getStatus(id) {
let error, result;
diff --git a/dashboard/src/views/SystemView.vue b/dashboard/src/views/SystemView.vue
index 28219869b..e8dd84ffb 100644
--- a/dashboard/src/views/SystemView.vue
+++ b/dashboard/src/views/SystemView.vue
@@ -5,6 +5,7 @@ import { Button } from 'pankow';
import moment from 'moment';
import { prettyDecimalSize } from 'pankow/utils';
import Section from '../components/Section.vue';
+import DiskUsage from '../components/DiskUsage.vue';
import SystemModel from '../models/SystemModel.js';
import DashboardModel from '../models/DashboardModel.js';
@@ -41,7 +42,6 @@ onMounted(async () => {
[error, result] = await dashboardModel.getConfig();
if (error) return console.error(error);
config.value = result;
-
});
@@ -82,7 +82,8 @@ onMounted(async () => {
{{ $t('system.info.activationTime') }}
{{ activeSince }}
-
+
+
diff --git a/dashboard/src/views/VolumesView.vue b/dashboard/src/views/VolumesView.vue
index 22132a82e..dd393919e 100644
--- a/dashboard/src/views/VolumesView.vue
+++ b/dashboard/src/views/VolumesView.vue
@@ -83,7 +83,11 @@ const volumeDialogValid = computed(() => {
async function refresh() {
busy.value = true;
- volumes.value = await volumesModel.list();
+
+ const [error, result] = await volumesModel.list();
+ if (error) return console.error(error);
+ volumes.value = result;
+
busy.value = false;
for (const v of volumes.value) {