diff --git a/app/javascript/dashboard/api/captain/document.js b/app/javascript/dashboard/api/captain/document.js index dc22b0c32..a4ec6b23e 100644 --- a/app/javascript/dashboard/api/captain/document.js +++ b/app/javascript/dashboard/api/captain/document.js @@ -15,6 +15,14 @@ class CaptainDocument extends ApiClient { }, }); } + + uploadPdf(formData) { + return axios.post(`${this.url}/upload_pdf`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + } } export default new CaptainDocument(); diff --git a/app/javascript/dashboard/components-next/captain/assistant/DocumentCard.vue b/app/javascript/dashboard/components-next/captain/assistant/DocumentCard.vue index d6e546581..d0e85d246 100644 --- a/app/javascript/dashboard/components-next/captain/assistant/DocumentCard.vue +++ b/app/javascript/dashboard/components-next/captain/assistant/DocumentCard.vue @@ -26,6 +26,10 @@ const props = defineProps({ type: String, required: true, }, + file: { + type: Object, + default: null, + }, createdAt: { type: Number, required: true, @@ -63,6 +67,22 @@ const menuItems = computed(() => { const createdAt = computed(() => dynamicTime(props.createdAt)); +const displayLink = computed(() => { + // For PDF uploads, show the filename instead of the generated external_link + if (props.file?.filename) { + return props.file.filename; + } + return props.externalLink; +}); + +const actualLink = computed(() => { + // For PDF uploads, return the actual file URL; for URLs, return the external_link + if (props.file?.url) { + return props.file.url; + } + return props.externalLink; +}); + const handleAction = ({ action, value }) => { toggleDropdown(false); emit('action', { action, value, id: props.id }); @@ -103,12 +123,15 @@ const handleAction = ({ action, value }) => { {{ assistant?.name || '' }} - - {{ externalLink }} - + {{ displayLink }} +
{{ createdAt }}
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/document/CreateDocumentDialog.vue b/app/javascript/dashboard/components-next/captain/pageComponents/document/CreateDocumentDialog.vue index 7db74f523..995453ae6 100644 --- a/app/javascript/dashboard/components-next/captain/pageComponents/document/CreateDocumentDialog.vue +++ b/app/javascript/dashboard/components-next/captain/pageComponents/document/CreateDocumentDialog.vue @@ -2,28 +2,43 @@ import { ref } from 'vue'; import { useStore } from 'dashboard/composables/store'; import { useAlert } from 'dashboard/composables'; -import { useI18n } from 'vue-i18n'; - import Dialog from 'dashboard/components-next/dialog/Dialog.vue'; import DocumentForm from './DocumentForm.vue'; -const emit = defineEmits(['close']); -const { t } = useI18n(); +const emit = defineEmits(['close', 'success']); const store = useStore(); const dialogRef = ref(null); const documentForm = ref(null); -const i18nKey = 'CAPTAIN.DOCUMENTS.CREATE'; - const handleSubmit = async newDocument => { try { - await store.dispatch('captainDocuments/create', newDocument); - useAlert(t(`${i18nKey}.SUCCESS_MESSAGE`)); + if (newDocument.type === 'pdf') { + // Handle PDF upload + const formData = new FormData(); + formData.append('pdf_document', newDocument.pdf_document); + formData.append('assistant_id', newDocument.assistant_id); + + await store.dispatch('captainDocuments/uploadPdf', formData); + useAlert('PDF uploaded successfully! Processing will begin shortly.'); + } else { + // Handle URL creation + await store.dispatch('captainDocuments/create', { + document: { + external_link: newDocument.external_link, + assistant_id: newDocument.assistant_id, + }, + }); + useAlert('Document created successfully!'); + } + + // Emit success event to refresh the list + emit('success'); dialogRef.value.close(); } catch (error) { const errorMessage = - error?.response?.message || t(`${i18nKey}.ERROR_MESSAGE`); + error?.response?.data?.message || + 'Failed to create document. Please try again.'; useAlert(errorMessage); } }; @@ -42,8 +57,8 @@ defineExpose({ dialogRef });