diff --git a/frontend/app/components/Builder/FormSettings.vue b/frontend/app/components/Builder/FormSettings.vue
index 54201ce..c07abe1 100644
--- a/frontend/app/components/Builder/FormSettings.vue
+++ b/frontend/app/components/Builder/FormSettings.vue
@@ -65,8 +65,7 @@ const updateDesign = (key: string, value: unknown) => {
};
const handleSlugInput = (event: Event) => {
- const input = event.target as HTMLInputElement;
- emit("slugInput", input.value);
+ emit("slugInput", event);
};
const handleCopyLink = async () => {
diff --git a/frontend/app/components/ThemeToggle.vue b/frontend/app/components/ThemeToggle.vue
deleted file mode 100644
index 7f9de47..0000000
--- a/frontend/app/components/ThemeToggle.vue
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/app/composables/useApi.ts b/frontend/app/composables/useApi.ts
index ae39fe7..5ba1c84 100644
--- a/frontend/app/composables/useApi.ts
+++ b/frontend/app/composables/useApi.ts
@@ -9,12 +9,13 @@ export const getFileUrl = (pathOrUrl: string | undefined | null): string => {
const apiUrl = config.public.apiUrl as string;
const cleanPath = pathOrUrl.startsWith("/") ? pathOrUrl.slice(1) : pathOrUrl;
- return `${apiUrl}/files/${cleanPath}`;
+ return `${apiUrl}/uploads/${cleanPath}`;
};
export const useApi = () => {
const config = useRuntimeConfig();
const apiUrl = config.public.apiUrl as string;
+ const apiBase = `${apiUrl}/api`;
const getToken = () => {
return localStorage.getItem("token");
@@ -28,7 +29,7 @@ export const useApi = () => {
...options.headers,
};
- const response = await fetch(`${apiUrl}${endpoint}`, {
+ const response = await fetch(`${apiBase}${endpoint}`, {
...options,
headers,
});
@@ -112,11 +113,11 @@ export const useApi = () => {
stats: (formId: string): Promise => request(`/forms/${formId}/stats`),
exportCSV: (formId: string): string => {
const token = getToken();
- return `${apiUrl}/forms/${formId}/export/csv?token=${token}`;
+ return `${apiBase}/forms/${formId}/export/csv?token=${token}`;
},
exportJSON: (formId: string): string => {
const token = getToken();
- return `${apiUrl}/forms/${formId}/export/json?token=${token}`;
+ return `${apiBase}/forms/${formId}/export/json?token=${token}`;
},
};
@@ -169,7 +170,7 @@ export const useApi = () => {
let response: Response;
try {
- response = await fetch(`${apiUrl}/uploads/image`, {
+ response = await fetch(`${apiBase}/uploads/image`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
@@ -194,7 +195,7 @@ export const useApi = () => {
let response: Response;
try {
- response = await fetch(`${apiUrl}/uploads/file`, {
+ response = await fetch(`${apiBase}/uploads/file`, {
method: "POST",
headers: {
...(token ? { Authorization: `Bearer ${token}` } : {}),
diff --git a/frontend/app/composables/useAutoSave.ts b/frontend/app/composables/useAutoSave.ts
index c215bce..36e9cbe 100644
--- a/frontend/app/composables/useAutoSave.ts
+++ b/frontend/app/composables/useAutoSave.ts
@@ -2,11 +2,12 @@ interface AutoSaveOptions {
delay?: number;
onSave: () => Promise;
onError?: (error: unknown) => void;
+ onNoChanges?: () => void;
}
export const useAutoSave = (options: AutoSaveOptions) => {
const { t } = useI18n();
- const { delay = 2000, onSave, onError } = options;
+ const { delay = 2000, onSave, onError, onNoChanges } = options;
const isSaving = ref(false);
const isDirty = ref(false);
@@ -15,8 +16,12 @@ export const useAutoSave = (options: AutoSaveOptions) => {
let saveTimeout: ReturnType | null = null;
- const save = async () => {
- if (!isDirty.value || isSaving.value) return;
+ const save = async (manual = false) => {
+ if (isSaving.value) return;
+ if (!isDirty.value) {
+ if (manual) onNoChanges?.();
+ return;
+ }
if (saveTimeout) {
clearTimeout(saveTimeout);
@@ -58,7 +63,7 @@ export const useAutoSave = (options: AutoSaveOptions) => {
clearTimeout(saveTimeout);
saveTimeout = null;
}
- await save();
+ await save(true);
};
const cancel = () => {
diff --git a/frontend/app/layouts/default.vue b/frontend/app/layouts/default.vue
index 438439e..ebf3c98 100644
--- a/frontend/app/layouts/default.vue
+++ b/frontend/app/layouts/default.vue
@@ -62,7 +62,6 @@
-
@@ -103,7 +102,6 @@