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 @@
- {{ mapDocType(data.ingestionInfo.metadata.KsDoctype) }}
+ {{data.ingestionInfo.metadata.KsDoctype.replace(/_/g, ' ').replace(/\b\w/g, char =>
+ char.toUpperCase())}}
+ :disabled="(slotProps.data.ingestionStatus !== 'INGESTED' && slotProps.data.ingestionStatus !== 'LOADED' && slotProps.data.ingestionStatus !== 'ERROR') || slotProps.data.ingestionStatus == 'IN PROGRESS'"
+ :class="{ 'mr-2 p-button': slotProps.data.ingestionStatus !== 'INGESTED' && slotProps.data.ingestionStatus !== 'LOADED' }">
+
+
@@ -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');
}
-