191 lines
5.9 KiB
Vue
191 lines
5.9 KiB
Vue
<template>
|
|
<SMPage :page-error="pageError" permission="admin/media">
|
|
<SMRow>
|
|
<SMFormCard>
|
|
<h1>{{ page_title }}</h1>
|
|
<SMForm
|
|
:model-value="form"
|
|
:loading_message="formLoadingMessage"
|
|
@submit="handleSubmit">
|
|
<SMRow>
|
|
<SMColumn>
|
|
<SMInput control="file" type="file" />
|
|
</SMColumn>
|
|
</SMRow>
|
|
<SMRow>
|
|
<SMColumn>
|
|
<SMInput
|
|
contorl="url"
|
|
type="link"
|
|
label="URL"
|
|
:href="formData.url.value" />
|
|
</SMColumn>
|
|
</SMRow>
|
|
<SMRow>
|
|
<SMColumn>
|
|
<SMInput
|
|
v-model="computedFileSize"
|
|
type="static"
|
|
label="File Size" />
|
|
</SMColumn>
|
|
<SMColumn>
|
|
<SMInput
|
|
v-model="formData.mime.value"
|
|
type="static"
|
|
label="File Mime" />
|
|
</SMColumn>
|
|
</SMRow>
|
|
<SMRow>
|
|
<SMColumn>
|
|
<SMInput
|
|
v-model="formData.permission.value"
|
|
label="Permission"
|
|
:error="formData.permission.error"
|
|
@blur="fieldValidate(formData.permission)" />
|
|
</SMColumn>
|
|
</SMRow>
|
|
<SMRow>
|
|
<SMColumn>
|
|
<SMButton
|
|
type="danger"
|
|
label="Delete"
|
|
@click="handleDelete" />
|
|
</SMColumn>
|
|
<SMColumn class="justify-content-end">
|
|
<SMButton type="submit" label="Save" />
|
|
</SMColumn>
|
|
</SMRow>
|
|
</SMForm>
|
|
</SMFormCard>
|
|
</SMRow>
|
|
</SMPage>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { computed, reactive, ref } from "vue";
|
|
import { useRoute, useRouter } from "vue-router";
|
|
import SMButton from "../../components/SMButton.vue";
|
|
import SMFormCard from "../../components/SMFormCard.vue";
|
|
import SMForm from "../../components/SMForm.vue";
|
|
import SMInput from "../../components/SMInput.vue";
|
|
|
|
import { api } from "../../helpers/api";
|
|
import { Form, FormControl } from "../../helpers/form";
|
|
import { bytesReadable } from "../../helpers/types";
|
|
import { And, FileSize, Required } from "../../helpers/validate";
|
|
|
|
const router = useRouter();
|
|
const pageError = ref(200);
|
|
const formLoadingMessage = ref("");
|
|
|
|
const route = useRoute();
|
|
const page_title = route.params.id ? "Edit Media" : "Upload Media";
|
|
|
|
let form = reactive(
|
|
Form({
|
|
file: FormControl("", And([Required(), FileSize(5242880)])),
|
|
permission: FormControl(),
|
|
})
|
|
);
|
|
|
|
const fileData = reactive({
|
|
url: "",
|
|
mime: "",
|
|
size: 0,
|
|
});
|
|
|
|
const handleLoad = async () => {
|
|
if (route.params.id) {
|
|
try {
|
|
let res = await api.get(`media/${route.params.id}`);
|
|
|
|
form.file.value = res.data.media.name;
|
|
form.permission.value = res.data.media.permission;
|
|
fileData.url = res.data.media.url;
|
|
fileData.mime = res.data.media.mime;
|
|
fileData.size = res.data.media.size;
|
|
} catch (err) {
|
|
form.apiErrors(err);
|
|
}
|
|
}
|
|
|
|
form.loading(false);
|
|
};
|
|
|
|
const handleSubmit = async () => {
|
|
try {
|
|
let res = null;
|
|
// let data = {
|
|
// title: formData.title.value,
|
|
// slug: formData.slug.value,
|
|
// user_id: formData.user_id.value,
|
|
// content: formData.content.value
|
|
// }
|
|
|
|
// if(route.params.id) {
|
|
// res = await axios.put(`posts/${route.params.id}`, data);
|
|
// } else {
|
|
// res = await axios.post(`posts`, data);
|
|
// }
|
|
|
|
let submitFormData = new FormData();
|
|
if (form.file.value instanceof File) {
|
|
submitFormData.append("file", form.file.value);
|
|
}
|
|
|
|
submitFormData.append("permission", form.permission.value);
|
|
|
|
await api.post({
|
|
url: "/media",
|
|
body: submitFormData,
|
|
headers: {
|
|
"Content-Type": "multipart/form-data",
|
|
},
|
|
progress: (progressEvent) =>
|
|
(formLoadingMessage.value = `Uploading Files ${Math.floor(
|
|
(progressEvent.loaded / progressEvent.total) * 100
|
|
)}%`),
|
|
});
|
|
|
|
form.message("Your details have been updated", "success");
|
|
} catch (err) {
|
|
form.apiErrors(err);
|
|
}
|
|
|
|
form.loading(false);
|
|
};
|
|
|
|
const handleDelete = async () => {
|
|
let result = await openDialog(DialogConfirm, {
|
|
title: "Delete File?",
|
|
text: `Are you sure you want to delete the file <strong>${item.title}</strong>?`,
|
|
cancel: {
|
|
type: "secondary",
|
|
label: "Cancel",
|
|
},
|
|
confirm: {
|
|
type: "danger",
|
|
label: "Delete File",
|
|
},
|
|
});
|
|
|
|
if (result) {
|
|
try {
|
|
await api.delete(`media/${item.id}`);
|
|
router.push({ name: "media" });
|
|
} catch (err) {
|
|
alert(
|
|
err.response?.data?.message ||
|
|
"An unexpected server error occurred"
|
|
);
|
|
}
|
|
}
|
|
};
|
|
|
|
const computedFileSize = computed(() => {
|
|
return bytesReadable(fileData.size);
|
|
});
|
|
|
|
handleLoad();
|
|
</script>
|