AddStudentMediaDialog.vue 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <q-dialog ref="dialogRef" @hide="onDialogHide">
  3. <q-card class="q-dialog-plugin dialog-form-card" style="width: 480px; max-width: 95vw">
  4. <DefaultDialogHeader title="Adicionar Mídia" @close="onDialogCancel" />
  5. <DefaultForm ref="formRef" @submit="onSubmit">
  6. <q-scroll-area class="dialog-form-scroll dialog-form-scroll--xs">
  7. <q-card-section class="q-pt-none">
  8. <div class="column q-gutter-sm">
  9. <DefaultInput
  10. v-model="form.name"
  11. :error="!!validationErrors.name"
  12. :error-message="validationErrors.name"
  13. label="Nome do documento"
  14. :rules="[inputRules.required]"
  15. />
  16. <q-file
  17. v-model="selectedFile"
  18. :error="!!validationErrors.file"
  19. :error-message="validationErrors.file"
  20. label="Arquivo"
  21. outlined
  22. accept="image/*,video/*,.pdf"
  23. :rules="[inputRules.required]"
  24. >
  25. <template #prepend>
  26. <q-icon name="mdi-paperclip" />
  27. </template>
  28. </q-file>
  29. </div>
  30. </q-card-section>
  31. </q-scroll-area>
  32. <q-card-actions align="right" class="q-pa-md">
  33. <q-btn outline color="primary" label="Cancelar" @click="onDialogCancel" />
  34. <q-btn color="primary" label="Adicionar" type="submit" :loading="loading" />
  35. </q-card-actions>
  36. </DefaultForm>
  37. </q-card>
  38. </q-dialog>
  39. </template>
  40. <script setup>
  41. import { ref } from "vue";
  42. import { useDialogPluginComponent } from "quasar";
  43. import { useInputRules } from "src/composables/useInputRules";
  44. import { useSubmitHandler } from "src/composables/useSubmitHandler";
  45. import { createStudentMedia } from "src/api/student_media";
  46. import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
  47. import DefaultInput from "src/components/defaults/DefaultInput.vue";
  48. defineEmits([...useDialogPluginComponent.emits]);
  49. const { studentId } = defineProps({
  50. studentId: { type: Number, required: true },
  51. });
  52. const { inputRules } = useInputRules();
  53. const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent();
  54. const formRef = ref(null);
  55. const selectedFile = ref(null);
  56. const form = ref({ name: "" });
  57. const { loading, validationErrors, execute } = useSubmitHandler({
  58. formRef,
  59. onSuccess: (result) => onDialogOK(result),
  60. });
  61. async function onSubmit() {
  62. await execute(() => {
  63. const formData = new FormData();
  64. formData.append("name", form.value.name);
  65. formData.append("student_id", studentId);
  66. formData.append("file", selectedFile.value);
  67. return createStudentMedia(formData);
  68. });
  69. }
  70. </script>