diff --git a/src/service/KsDocumentService.js b/src/service/KsDocumentService.js index 73c88e3..638850e 100644 --- a/src/service/KsDocumentService.js +++ b/src/service/KsDocumentService.js @@ -1,11 +1,20 @@ import axios from 'axios'; export const KsDocumentService = { getKsDocuments() { - return axios.get('/fe-api/ksdocuments') + return axios.get('/fe-api/ksdocuments'); }, downloadKsDocument(doc) { - return axios.post('/fe-api/ksdocuments/downloadKSDocument', doc, { responseType: "blob", }); + return axios.post('/fe-api/ksdocuments/downloadKSDocument', doc, { responseType: 'blob' }); + }, + deleteKsDocumentRecord(requestPayload) { + return axios.post('/fe-api/vector-store/deleteRecords', requestPayload); + }, + uploadKsDocument(formData, onUploadProgress) { + return axios.post('/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + }, + onUploadProgress + }); } - - -} \ No newline at end of file +}; diff --git a/src/service/KsVideoService.js b/src/service/KsVideoService.js index 6d21eab..186bdd7 100644 --- a/src/service/KsVideoService.js +++ b/src/service/KsVideoService.js @@ -10,6 +10,10 @@ export const KsVideoService = { }, downloadKsVideo(video) { - return axios.get(`/fe-api/ksvideos/downloadKSVideo`, video, {responseType: 'blob', }); + return axios.get(`/fe-api/ksvideos/downloadKSVideo`, video, { responseType: 'blob' }); + }, + + deleteKsVideoRecord(requestPayload) { + return axios.post('/fe-api/vector-store/deleteVideoRecords', requestPayload); } }; diff --git a/src/stores/KsDocumentStore.js b/src/stores/KsDocumentStore.js index c30d693..05d1b12 100644 --- a/src/stores/KsDocumentStore.js +++ b/src/stores/KsDocumentStore.js @@ -3,34 +3,47 @@ import { computed, ref } from 'vue'; import { KsDocumentService } from '../service/KsDocumentService'; import { LoadingStore } from './LoadingStore'; - export const KsDocumentStore = defineStore('ksdocument_store', () => { - - const lstKsDocument = ref([]) - const selectedKsDocument = ref(null) - const loadingStore = LoadingStore() - + const lstKsDocument = ref([]); + const selectedKsDocument = ref(null); + const loadingStore = LoadingStore(); async function fetchKsDocument() { loadingStore.scenario_loading = true; - await KsDocumentService.getKsDocuments().then(resp => { + await KsDocumentService.getKsDocuments().then((resp) => { lstKsDocument.value = resp.data; loadingStore.scenario_loading = false; }); - } const ksDocument = computed(() => { - return lstKsDocument.value - }) + return lstKsDocument.value; + }); const getSelectedKsDocument = computed(() => { - return selectedKsDocument.value - }) + return selectedKsDocument.value; + }); - async function setSelectedKsDocument(ksDoc){ - selectedKsDocument.value = ksDoc - console.log("selectedExecScenario", selectedKsDocument.value); + async function setSelectedKsDocument(ksDoc) { + selectedKsDocument.value = ksDoc; + console.log('selectedExecScenario', selectedKsDocument.value); } - - return { fetchKsDocument, selectedKsDocument, lstKsDocument, ksDocument, getSelectedKsDocument, setSelectedKsDocument} - }) \ No newline at end of file + async function deleteKsDocumentRecord(requestPayload) { + try { + const response = await KsDocumentService.deleteKsDocumentRecord(requestPayload); + return response; + } catch (error) { + throw error; + } + } + + async function uploadKsDocument(formData, onUploadProgress) { + try { + const response = await KsDocumentService.uploadKsDocument(formData, onUploadProgress); + return response; + } catch (error) { + throw error; + } + } + + return { fetchKsDocument, deleteKsDocumentRecord, uploadKsDocument, selectedKsDocument, lstKsDocument, ksDocument, getSelectedKsDocument, setSelectedKsDocument }; +}); diff --git a/src/stores/KsVideoStore.js b/src/stores/KsVideoStore.js index 36e9d48..5e6c9a8 100644 --- a/src/stores/KsVideoStore.js +++ b/src/stores/KsVideoStore.js @@ -4,11 +4,9 @@ import { KsVideoService } from '../service/KsVideoService'; import { LoadingStore } from './LoadingStore'; export const KsVideoStore = defineStore('ksvideo_store', () => { - - const lstKsVideo = ref([]) - const selectedKsVideo = ref(null) - const loadingStore = LoadingStore() - + const lstKsVideo = ref([]); + const selectedKsVideo = ref(null); + const loadingStore = LoadingStore(); async function fetchKsVideoByGroupId(groupId) { try { @@ -38,5 +36,14 @@ export const KsVideoStore = defineStore('ksvideo_store', () => { console.log('selectedExecScenario', selectedKsVideo.value); } - return {fetchKsVideoByGroupId, selectedKsVideo, lstKsVideo, ksVideo, getKsVideoByGroupId, getSelectedKsVideo, setSelectedKsVideo }; + async function deleteKsVideoRecord(requestPayload) { + try { + const response = await KsVideoService.deleteKsVideoRecord(requestPayload); + return response; + } catch (error) { + throw error; + } + } + + return { fetchKsVideoByGroupId, selectedKsVideo, lstKsVideo, ksVideo, getKsVideoByGroupId, getSelectedKsVideo, setSelectedKsVideo, deleteKsVideoRecord }; }); diff --git a/src/views/pages/KsVideos/KsNewVideoForm.vue b/src/views/pages/KsVideos/KsNewVideoForm.vue index 5d849d4..bcd4659 100644 --- a/src/views/pages/KsVideos/KsNewVideoForm.vue +++ b/src/views/pages/KsVideos/KsNewVideoForm.vue @@ -138,7 +138,9 @@
-

Wait until the upload is completed. You will be automatically redirected in few minutes.

+

Wait until the upload is completed. You will be automatically redirected in + few + minutes.

@@ -311,7 +313,7 @@ const onFileRemove = () => { }; -const deleteRecord = (name) => { +const deleteRecord = async (name) => { const videoToDelete = ksVideos.value.find(video => video.name === name); if (!videoToDelete) { console.error('Video not found'); @@ -327,15 +329,12 @@ const deleteRecord = (name) => { ksApplicationName: videoToDelete.ingestionInfo.metadata.KsApplicationName, }; - axios.post('/fe-api/vector-store/deleteVideoRecords', requestPayload) - .then(response => { - console.log('Delete resource:', response.data) - }) - .catch(error => { - console.error('Error overwriting records: ', error) - toast.add({ severity: 'error', summary: 'Error', detail: 'Error in Overwriting', life: 3000 }); - }); - + try { + await ksVideoStore.deleteKsVideoRecord(requestPayload); + } catch (error) { + console.error('Error overwriting records: ', error) + toast.add({ severity: 'error', summary: 'Error', detail: 'Error in Overwriting', life: 3000 }); + } }; const submitForm = async () => { diff --git a/src/views/pages/KsVideos/KsVideos.vue b/src/views/pages/KsVideos/KsVideos.vue index b546f26..d3b1c31 100644 --- a/src/views/pages/KsVideos/KsVideos.vue +++ b/src/views/pages/KsVideos/KsVideos.vue @@ -71,7 +71,8 @@ + @@ -121,13 +128,14 @@ import axios from 'axios'; import moment from 'moment'; import { useConfirm } from "primevue/useconfirm"; import { useToast } from 'primevue/usetoast'; -import { computed, onMounted, onUnmounted, ref } from 'vue'; +import { onMounted, onUnmounted, ref } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import Button from 'primevue/button'; import Column from 'primevue/column'; import DataTable from 'primevue/datatable'; import DatePicker from 'primevue/datepicker'; +import Dialog from 'primevue/dialog'; import InputText from 'primevue/inputtext'; import Select from 'primevue/select'; import Tag from 'primevue/tag'; @@ -155,6 +163,35 @@ const loadingStore = LoadingStore(); const fe_status = ref(''); let updateTimer = null; // Variabile per memorizzare l'ID del timer +const isVideoPlayerVisible = ref(false); +const selectedVideoUrl = ref(null); + +const playVideo = async (video) => { + try { + // 1) Scarica il video come arraybuffer o blob + const response = await KsVideoService.downloadKsVideo(video) + // 2) Leggi il content-type dinamico + const contentType = response.headers['content-type'] || 'video/mp4' + // 3) Crea il blob + const blob = new Blob([response.data], { type: contentType }) + // 4) Crea e registra l'ObjectURL + const url = window.URL.createObjectURL(blob) + blobUrls.add(url) + // 5) Mostra il player + selectedVideoUrl.value = url + isVideoPlayerVisible.value = true + + } catch (err) { + console.error('Error while preparing video for playback:', err) + toast.add({ + severity: 'error', + summary: 'Playback Error', + detail: 'Impossibile caricare il video.', + life: 3000 + }) + } +} + const initFilters = () => { filters.value = { global: { value: null, matchMode: FilterMatchMode.CONTAINS }, @@ -199,8 +236,6 @@ const onRowCollapse = (event) => { }; -// watch(() => userPrefStore.getSelApp, updateVideos, { immediate: true }); - function updateVideos() { ksVideoStore.fetchKsVideoByGroupId(route.params.groupId).then(() => { ksVideos.value = getCustomDatewithAllResponse(); @@ -214,9 +249,6 @@ const getCustomDatewithAllResponse = () => { }); }; -const allVideosIngested = computed(() => { - return ksVideos.value && ksVideos.value.every(doc => doc.ingestionStatus == 'INGESTED'); -}); const getStatus = (data) => { if (data.ingestionStatus == 'INGESTED') { @@ -235,9 +267,6 @@ const updateFilterModel = () => { console.log("updateFilterModel") } -// Variabile reattiva per il nome del file -const filename = ref(""); - // Funzione per scaricare il file const downloadFile = async (video) => { console.log("video", video) @@ -330,6 +359,32 @@ const confirmDeleteFromVectorStore = (id) => { }) }; +// Funzione per cancellare record in stato LOADED +const deleteLoadedRecord = async (id) => { + toast.add({ severity: 'info', summary: 'Info', detail: 'Deleting record...', life: 3000 }); + const videoToDelete = ksVideos.value.find(video => video.id === id); + if (!videoToDelete) { + toast.add({ severity: 'error', summary: 'Error', detail: 'Video not found', life: 3000 }); + return; + } + const requestPayload = { + ksDocumentId: videoToDelete.id, + ksIngestionInfoId: videoToDelete.ingestionInfo.id, + ksDocType: videoToDelete.ingestionInfo.metadata.KsDoctype, + ksDocSource: videoToDelete.ingestionInfo.metadata.KsDocSource, + ksFileSource: videoToDelete.ingestionInfo.metadata.KsFileSource, + ksApplicationName: videoToDelete.ingestionInfo.metadata.KsApplicationName, + }; + try { + await ksVideoStore.deleteKsVideoRecord(requestPayload); + toast.add({ severity: 'success', summary: 'Success', detail: 'Record deleted', life: 3000 }); + updateVideos(); + } catch (error) { + toast.add({ severity: 'error', summary: 'Error', detail: 'Error deleting record', life: 3000 }); + } +}; + + //ingestion const startIndividualngestion = (id) => { toast.add({ severity: 'info', summary: 'Info', detail: 'Starting indexing...', life: 3000 }); @@ -358,28 +413,6 @@ const startIndividualngestion = (id) => { }); }; -const startlngestion = () => { - axios.get('/test/ingestion_loop') - .then(response => { - ingestionResult.value = response.data; - if (response.data.status == "OK") { - ksVideos.value.forEach(element => { - if (response.data.ingestedVideoId.includes(element.id)) { - element.status = "INGESTED" - } - }); - } else { - ingestionResult.value = `Error: ${response.data.message}`; - } - - //ingestionDialogVisible.value = true; - }) - .catch(error => { - //ingestionDialogVisible.value = true; - console.error('Error ingesting records: ', error) - toast.add({ severity: 'error', summary: 'Error', detail: 'Error in Ingestion', life: 3000 }); - }); -}; //new record creation const newKsVideo = () => { @@ -413,13 +446,10 @@ const mapDocType = (type) => { return mapping[type] || type; }; -// Function to format date string function formatDate(dateString) { - // Parse the date string using moment return moment(dateString).format('DD/MM/YYYY'); } -