diff --git a/apps/website/src/detect/cnn-job-detail-by-species/cnn-job-detail-by-species.vue b/apps/website/src/detect/cnn-job-detail-by-species/cnn-job-detail-by-species.vue index 74a62759c..90a903af5 100644 --- a/apps/website/src/detect/cnn-job-detail-by-species/cnn-job-detail-by-species.vue +++ b/apps/website/src/detect/cnn-job-detail-by-species/cnn-job-detail-by-species.vue @@ -59,6 +59,7 @@ const route = useRoute() const pageSizeLimit = ref(25) const apiClientBio = inject(apiClientKey) as AxiosInstance + const detectionsResultFilterBySpeciesStore = useDetectionsResultFilterBySpeciesStore() const jobId = computed(() => typeof route.params.jobId === 'string' ? parseInt(route.params.jobId) : -1) const speciesSlug = computed(() => typeof route.params.speciesSlug === 'string' ? route.params.speciesSlug : '') diff --git a/apps/website/src/detect/cnn-job-detail-by-species/components/job-detections.vue b/apps/website/src/detect/cnn-job-detail-by-species/components/job-detections.vue index 494d07a52..b96175426 100644 --- a/apps/website/src/detect/cnn-job-detail-by-species/components/job-detections.vue +++ b/apps/website/src/detect/cnn-job-detail-by-species/components/job-detections.vue @@ -36,6 +36,7 @@ :validation="dt.validation" :checked="dt.checked" :site="dt.site" + :site-id-core="dt.siteIdCore" :start="dt.start" :score="dt.score" :selected-grouping="selectedGrouping" @@ -229,6 +230,7 @@ const allSpecies = computed site.idCore === detection.siteIdCore)[0]?.name ?? '' } }) diff --git a/apps/website/src/detect/cnn-job-detail/components/detection-item.vue b/apps/website/src/detect/cnn-job-detail/components/detection-item.vue index ecd0b9f42..542ba7ef2 100644 --- a/apps/website/src/detect/cnn-job-detail/components/detection-item.vue +++ b/apps/website/src/detect/cnn-job-detail/components/detection-item.vue @@ -61,6 +61,7 @@
@@ -93,10 +94,11 @@ import dayjs from 'dayjs' import { Howl } from 'howler' import { inject, onBeforeUnmount, onMounted, ref, watch } from 'vue' +import { apiArbimonLegacyFindRecording } from '@rfcx-bio/common/api-arbimon/recordings-query' import { type ArbimonReviewStatus } from '@rfcx-bio/common/api-bio/cnn/classifier-job-information' import { apiCoreGetMedia } from '@rfcx-bio/common/api-core/media/core-media' -import { apiClientMediaKey } from '@/globals' +import { apiClientArbimonLegacyKey, apiClientMediaKey } from '@/globals' import { useStore } from '~/store' import type { DetectionEvent } from './types' import ValidationStatus from './validation-status.vue' @@ -110,7 +112,8 @@ const props = withDefaults(defineProps<{ score?: number | undefined, start?: string | undefined, site?: string | undefined, - selectedGrouping?: string | undefined + selectedGrouping?: string | undefined, + siteIdCore?: string | undefined }>(), { id: null, checked: null, @@ -129,6 +132,7 @@ const highlightBorder = ref(false) const isSelected = ref(false) const apiMedia = inject(apiClientMediaKey) as AxiosInstance +const apiClientArbimon = inject(apiClientArbimonLegacyKey) as AxiosInstance const audio = ref(null) const spectrogram = ref(null) @@ -193,6 +197,13 @@ const stop = () => { audio.value?.stop() } +const onVisualizerRedirect = async (): Promise => { + if (!props.start || !props.siteIdCore) return + const response = await apiArbimonLegacyFindRecording(apiClientArbimon, store.project?.slug ?? '', { start: props.start, site_external_id: props.siteIdCore }) + if (response == null) return + window.location.assign(`${window.location.origin}/project/${store.project?.slug}/visualizer/rec/${response}`) +} + const toggleDetection = (event: MouseEvent) => { if (!store.userIsExpertMember) return isSelected.value = !isSelected.value diff --git a/apps/website/src/detect/cnn-job-detail/components/types.ts b/apps/website/src/detect/cnn-job-detail/components/types.ts index a5c58a028..85b70159e 100644 --- a/apps/website/src/detect/cnn-job-detail/components/types.ts +++ b/apps/website/src/detect/cnn-job-detail/components/types.ts @@ -18,6 +18,7 @@ export interface DetectionMedia { validation: ArbimonReviewStatus score?: number site?: string + siteIdCore?: string start?: string } diff --git a/packages/common/src/api-arbimon/recordings-query.ts b/packages/common/src/api-arbimon/recordings-query.ts new file mode 100644 index 000000000..6c578464b --- /dev/null +++ b/packages/common/src/api-arbimon/recordings-query.ts @@ -0,0 +1,13 @@ +import { type AxiosInstance } from 'axios' + +export interface RecordingsQueryParams { + start: string + end?: string + site_external_id: string + project_id?: number +} + +export const apiArbimonLegacyFindRecording = async (apiClient: AxiosInstance, slug: string, params: RecordingsQueryParams): Promise => { + const response = await apiClient.get(`/legacy-api/project/${slug}/recordings/query`, { params }) + return Number(response.data) +}