+
+
+ No files uploaded yet.
+
+
-
diff --git a/mizuki-frontend/src/components/FileListItem.vue b/mizuki-frontend/src/components/FileListItem.vue
index 0c5aa18..f78a3cb 100644
--- a/mizuki-frontend/src/components/FileListItem.vue
+++ b/mizuki-frontend/src/components/FileListItem.vue
@@ -3,6 +3,9 @@
import Card from 'primevue/card';
import Button from 'primevue/button';
import {computed} from "vue";
+ import { useConfirm } from "primevue/useconfirm";
+
+ const confirm = useConfirm();
const props = defineProps<{
item: FileDto
@@ -15,12 +18,28 @@
})
const removeItem = async () => {
- await fetch(`/api/file/delete?filename=${props.item.filename}`, {
- method: 'GET',
- credentials: 'include'
- });
+ confirm.require({
+ message: `Are you sure you want to delete ${props.item.originalFilename}?`,
+ header: 'Confirmation',
+ icon: 'pi pi-exclamation-triangle',
+ rejectProps: {
+ label: 'Cancel',
+ severity: 'secondary',
+ outlined: true
+ },
+ acceptProps: {
+ label: 'Delete'
+ },
+ accept: async () => {
+ await fetch(`/api/file/delete?filename=${props.item.filename}`, {
+ method: 'GET',
+ credentials: 'include'
+ });
- emit("deleted");
+ emit("deleted");
+ },
+ reject: () => {}
+ });
}
const download = () => {
diff --git a/mizuki-frontend/src/components/PasswordChanger.vue b/mizuki-frontend/src/components/PasswordChanger.vue
index 18a1774..bfe0639 100644
--- a/mizuki-frontend/src/components/PasswordChanger.vue
+++ b/mizuki-frontend/src/components/PasswordChanger.vue
@@ -5,6 +5,9 @@ import Password from "primevue/password";
import {Form, type FormResolverOptions, type FormSubmitEvent} from "@primevue/forms";
import Button from "primevue/button";
import Divider from "primevue/divider";
+import {useToast} from "primevue/usetoast";
+
+const toast = useToast();
const formResolver = (ev: FormResolverOptions): Record
=> {
const resp = {
@@ -31,11 +34,48 @@ const formResolver = (ev: FormResolverOptions): Record => {
return resp;
};
-const onFormSubmit = (event: FormSubmitEvent) => {
+const onFormSubmit = async (event: FormSubmitEvent) => {
if (!event.valid) {
+ toast.add({
+ severity: "error",
+ detail: "Invalid data supplied."
+ });
+ return;
+ }
+
+ const resp = await fetch("/api/user/change_password", {
+ method: "POST",
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ oldPassword: event.states.CurrentPassword.value,
+ newPassword: event.states.Password.value
+ }),
+ credentials: "include"
+ })
+
+ if (resp.status == 400) {
+ toast.add({
+ severity: "error",
+ detail: "Password didn't pass security validation."
+ });
+ } else if (resp.status == 403) {
+ toast.add({
+ severity: "error",
+ detail: "The old password was incorrect."
+ });
+ } else if (resp.status == 200) {
+ toast.add({
+ severity: "success",
+ detail: "Password changed!"
+ });
} else {
-
+ toast.add({
+ severity: "error",
+ detail: "An unexpected error has occurred."
+ });
}
};
diff --git a/mizuki-frontend/src/components/Uploader.vue b/mizuki-frontend/src/components/Uploader.vue
index 3e08294..3b6b5a9 100644
--- a/mizuki-frontend/src/components/Uploader.vue
+++ b/mizuki-frontend/src/components/Uploader.vue
@@ -10,6 +10,8 @@
import type {FileCreationResultDto} from "@/dto/file-creation-result-dto.ts";
import type {FileCreationErrorDto} from "@/dto/file-creation-error-dto.ts";
+ const emit = defineEmits(["uploaded"]);
+
const totalSize = ref(0);
const totalSizePercent = ref(0);
const files = ref([]);
@@ -48,6 +50,7 @@
if ('filename' in resp) {
filename.value = resp.filename;
visible.value = true;
+ emit("uploaded");
} else if ('reason' in resp) {
toast.add({
severity: "error",
diff --git a/mizuki-frontend/src/dto/password-change-dto.ts b/mizuki-frontend/src/dto/password-change-dto.ts
new file mode 100644
index 0000000..97a3fdd
--- /dev/null
+++ b/mizuki-frontend/src/dto/password-change-dto.ts
@@ -0,0 +1,4 @@
+export interface PasswordChangeDto {
+ oldPassword: string;
+ newPassword: string;
+}
\ No newline at end of file
diff --git a/mizuki-frontend/src/main.ts b/mizuki-frontend/src/main.ts
index e82f937..49d3fc8 100644
--- a/mizuki-frontend/src/main.ts
+++ b/mizuki-frontend/src/main.ts
@@ -6,6 +6,7 @@ import router from './router'
import PrimeVue from 'primevue/config';
import ToastService from 'primevue/toastservice';
import Aura from '@primevue/themes/aura';
+import ConfirmationService from 'primevue/confirmationservice';
const app = createApp(App)
@@ -19,5 +20,6 @@ app.use(PrimeVue, {
}
});
app.use(ToastService);
+app.use(ConfirmationService);
app.mount('#app')
diff --git a/mizuki-frontend/src/views/HomeView.vue b/mizuki-frontend/src/views/HomeView.vue
index 2e87efa..ff3ddde 100644
--- a/mizuki-frontend/src/views/HomeView.vue
+++ b/mizuki-frontend/src/views/HomeView.vue
@@ -1,5 +1,5 @@
diff --git a/mizuki-frontend/src/views/RegisterView.vue b/mizuki-frontend/src/views/RegisterView.vue
index 3c33190..7e8498d 100644
--- a/mizuki-frontend/src/views/RegisterView.vue
+++ b/mizuki-frontend/src/views/RegisterView.vue
@@ -1,7 +1,7 @@