diff --git a/resources/js/components/dialogs/SMDialogMedia.vue b/resources/js/components/dialogs/SMDialogMedia.vue index 620b3f8..17f1c20 100644 --- a/resources/js/components/dialogs/SMDialogMedia.vue +++ b/resources/js/components/dialogs/SMDialogMedia.vue @@ -3,28 +3,38 @@ + :loading_message="formLoadingMessage" + class="sm-dialog-media">

Insert Media

-
-
    + v-if="formMessage" + icon="alert-circle-outline" + type="error" + :message="formMessage" /> +
    +
    • - + :class="[{ selected: item.id == selected }]" + @click="handleSelection(item.id)" + @dblclick="handlePickSelection(item.id)"> +
      + {{ item.title }} + {{ + bytesReadable(item.size) + }}
    - Page {{ page }} of {{ totalPages }} + + + + + {{ (page - 1) * perPage + 1 }} - + {{ (page - 1) * perPage + 12 }} of + {{ totalItems }} -import { computed, watch, ref, reactive, onMounted, onUnmounted } from "vue"; +import { computed, watch, ref, onMounted, onUnmounted, Ref } from "vue"; import { closeDialog } from "vue3-promise-dialog"; import SMButton from "../SMButton.vue"; import SMFormFooter from "../SMFormFooter.vue"; @@ -81,19 +96,25 @@ import SMDialog from "../SMDialog.vue"; import SMMessage from "../SMMessage.vue"; import SMModal from "../SMModal.vue"; import { api } from "../../helpers/api"; +import { bytesReadable } from "../../helpers/types"; +import { Media } from "../../helpers/api.types"; + +const props = defineProps({ + mime: { + type: String, + default: "image/", + required: false, + }, +}); const uploader = ref(null); const formLoading = ref(false); const formLoadingMessage = ref(""); -const formMessage = reactive({ - icon: "", - type: "", - message: "", -}); +const formMessage = ref(""); const page = ref(1); const totalItems = ref(0); -const mediaItems = ref([]); +const mediaItems: Ref = ref([]); const selected = ref(""); const perPage = ref(12); @@ -109,18 +130,16 @@ const handleConfirm = () => { } }; -const handleSelection = (item) => { - selected.value = item; +const handleSelection = (item_id: string): void => { + selected.value = item_id; }; -const handlePickSelection = (item) => { - closeDialog(item); +const handlePickSelection = (item_id: string): void => { + closeDialog(item_id); }; const handleLoad = async () => { - formMessage.type = "error"; - formMessage.icon = "alert-circle-outline"; - formMessage.message = ""; + formMessage.value = ""; selected.value = ""; try { @@ -142,11 +161,11 @@ const handleLoad = async () => { mediaItems.value = res.data.media; } catch (error) { if (error.status == 404) { - formMessage.type = "primary"; - formMessage.icon = "folder-open-outline"; - formMessage.message = "No media items found"; + // formMessage.type = "primary"; + // formMessage.icon = "folder-open-outline"; + // formMessage.message = "No media items found"; } else { - formMessage.message = + formMessage.value = error?.data?.message || "An unexpected error occurred"; } } @@ -158,9 +177,7 @@ const handleAskUpload = () => { const handleUpload = async () => { formLoading.value = true; - formMessage.type = "error"; - formMessage.icon = "alert-circle-outline"; - formMessage.message = ""; + formMessage.value = ""; try { let submitFormData = new FormData(); @@ -169,6 +186,9 @@ const handleUpload = async () => { let res = await api.post({ url: "/media", + params: { + mime: props.mime, + }, body: submitFormData, headers: { "Content-Type": "multipart/form-data", @@ -179,18 +199,18 @@ const handleUpload = async () => { // )}%`), }); - if (res.json.medium) { - closeDialog(res.json.medium); + if (res.data.medium) { + closeDialog(res.data.medium); } else { - formMessage.message = + formMessage.value = "An unexpected response was received from the server"; } } else { - formMessage.message = "No file was selected to upload"; + formMessage.value = "No file was selected to upload"; } } catch (err) { console.log(err); - formMessage.message = + formMessage.value = err.response?.data?.message || "An unexpected error occurred"; } @@ -251,62 +271,150 @@ handleLoad();