diff --git a/nextcloud_backup/backend/src/routes/config.ts b/nextcloud_backup/backend/src/routes/config.ts
index 397139c..5135b5b 100644
--- a/nextcloud_backup/backend/src/routes/config.ts
+++ b/nextcloud_backup/backend/src/routes/config.ts
@@ -22,24 +22,19 @@ configRouter.get("/backup", (req, res) => {
configRouter.put("/backup", (req, res) => {
validateBackupConfig(req.body as BackupConfig)
- .then(
- () => {
- return saveBackupConfig(req.body as BackupConfig);
- },
- (error: ValidationError) => {
- res.status(400).json(error.details);
+ .then(() => {
+ return saveBackupConfig(req.body as BackupConfig);
+ })
+ .then(() => {
+ res.status(204).send();
+ })
+ .catch((error: ValidationError) => {
+ if (error.details) {
+ res.status(400).json({ type: "validation", errors: error.details });
+ } else {
+ res.status(400).json({ type: "cron", errors: [error.message] });
}
- )
- .then(
- () => {
- res.status(204).send();
- },
- () => {
- res.status(400).json({
- message: "Fail to init cron, please check cron config",
- });
- }
- );
+ });
});
configRouter.get("/webdav", (req, res) => {
@@ -58,9 +53,9 @@ configRouter.put("/webdav", (req, res) => {
.catch((error: ValidationError) => {
res.status(400);
if (error.details) {
- res.json(error.details);
+ res.json({ type: "validation", errors: error.details });
} else {
- res.json(error);
+ res.json({ type: "validation", errors: error });
}
});
});
diff --git a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue
index 4419a4f..ac83c9f 100644
--- a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue
+++ b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoBackup.vue
@@ -26,6 +26,14 @@
{{ CronModeFriendly[cron.mode] }}
+
+ INVALID
+
();
+defineProps<{ loading: boolean, errors: string[] }>();
const backupConfigStore = useBackupConfigStore();
function removeCron(id: string) {
diff --git a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue
index 35c8b12..9b2af1b 100644
--- a/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue
+++ b/nextcloud_backup/frontend/src/components/settings/BackupConfig/BackupConfigAutoClean.vue
@@ -33,6 +33,8 @@
variant="outlined"
color="orange"
min="1"
+ :loading="loading"
+ :error-messages="errors.nbrToKeep"
>
@@ -66,6 +68,8 @@
variant="outlined"
color="orange"
min="1"
+ :loading="loading"
+ :error-messages="errors.nbrToKeep"
>
@@ -79,7 +83,7 @@
import { useBackupConfigStore } from "@/store/backupConfig";
import { storeToRefs } from "pinia";
-defineProps<{ loading: boolean }>();
+defineProps<{ loading: boolean, errors: any }>();
const backupConfigStore = useBackupConfigStore();
const { data } = storeToRefs(backupConfigStore);
diff --git a/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue b/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue
index d1e4025..da85c38 100644
--- a/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue
+++ b/nextcloud_backup/frontend/src/components/settings/BackupConfigForm.vue
@@ -41,6 +41,8 @@
density="compact"
variant="outlined"
color="orange"
+ :loading="loading"
+ :error-messages="errors.backupType"
>
@@ -65,12 +67,12 @@
-
+
-
+
@@ -105,12 +107,13 @@ const backupConfigStore = useBackupConfigStore();
const { data } = storeToRefs(backupConfigStore);
const errors = ref({
nameTemplate: [],
- username: [],
- password: [],
+ backupType: [],
+ nbrToKeep: [],
backupDir: [],
allowSelfSignedCerts: [],
type: [],
customEndpoint: [],
+ cron: []
});
const emit = defineEmits<{
diff --git a/nextcloud_backup/frontend/src/composable/ConfigForm.ts b/nextcloud_backup/frontend/src/composable/ConfigForm.ts
index 598c1cf..cce7174 100644
--- a/nextcloud_backup/frontend/src/composable/ConfigForm.ts
+++ b/nextcloud_backup/frontend/src/composable/ConfigForm.ts
@@ -26,13 +26,18 @@ export function useConfigForm(
.catch(async (reason) => {
if (reason instanceof HTTPError) {
const response = await reason.response.json();
- if (Array.isArray(response)) {
- for (const elem of response) {
+ if (response["type"] == "validation") {
+ for (const elem of response["errors"]) {
errorsRef.value[
elem.context.key as keyof typeof errorsRef.value
] = elem.message;
}
}
+ else if (response["type"] == "cron") {
+ for (const elem of response["errors"]) {
+ errorsRef.value["cron"].push(elem)
+ }
+ }
}
loading.value = false;
emit("fail");