Skip to content

Commit 7911b14

Browse files
authored
Merge pull request #783 from SlideRuleEarth/carlos-dev4
Granule name disappears when adding Photon cloud to the plot #778
2 parents 1b6bae4 + 14186e5 commit 7911b14

File tree

4 files changed

+96
-60
lines changed

4 files changed

+96
-60
lines changed
Lines changed: 78 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,88 @@
1-
import { defineStore } from 'pinia';
2-
import { ref } from 'vue';
3-
import { db as indexedDB } from '@/db/SlideRuleDb';
4-
import { createDuckDbClient } from '@/utils/SrDuckDb';
5-
import { createLogger } from '@/utils/logger';
1+
import { defineStore } from 'pinia'
2+
import { ref } from 'vue'
3+
import { db as indexedDB } from '@/db/SlideRuleDb'
4+
import { createDuckDbClient } from '@/utils/SrDuckDb'
5+
import { createLogger } from '@/utils/logger'
66

7-
const logger = createLogger('SrcIdTblStore');
7+
const logger = createLogger('SrcIdTblStore')
88

99
export const useSrcIdTblStore = defineStore('srcIdTblStore', () => {
10-
const sourceTable = ref<string[]>([]);
11-
12-
async function setSrcIdTblWithFileName(fileName: string) {
13-
const db = await createDuckDbClient();
14-
if (!db) {
15-
logger.error('Failed to create DuckDB client for file', { fileName });
16-
sourceTable.value = [];
17-
return;
10+
// Map to store multiple source tables keyed by reqId
11+
const sourceTables = ref<Map<number, string[]>>(new Map())
12+
13+
// Legacy support: keep sourceTable for backward compatibility
14+
const sourceTable = ref<string[]>([])
15+
16+
async function setSrcIdTblWithFileName(fileName: string, reqId?: number) {
17+
const db = await createDuckDbClient()
18+
if (!db) {
19+
logger.error('Failed to create DuckDB client for file', { fileName })
20+
if (reqId !== undefined) {
21+
sourceTables.value.set(reqId, [])
22+
}
23+
sourceTable.value = []
24+
return
25+
}
26+
await db.insertOpfsParquet(fileName)
27+
try {
28+
const parsed = (await db.getJsonMetaDataForKey('meta', fileName)).parsedMetadata
29+
if (parsed && parsed.srctbl && typeof parsed.srctbl === 'object') {
30+
// Convert object with numeric keys to an array
31+
const srcArray = Object.values(parsed.srctbl) as string[]
32+
if (reqId !== undefined) {
33+
sourceTables.value.set(reqId, srcArray)
34+
}
35+
sourceTable.value = srcArray
36+
} else {
37+
if (reqId !== undefined) {
38+
sourceTables.value.set(reqId, [])
1839
}
19-
await db.insertOpfsParquet(fileName);
20-
try {
21-
const parsed = (await db.getJsonMetaDataForKey( 'meta',fileName)).parsedMetadata;
22-
if (parsed && parsed.srctbl && typeof parsed.srctbl === 'object') {
23-
// Convert object with numeric keys to an array
24-
sourceTable.value = Object.values(parsed.srctbl);
25-
} else {
26-
sourceTable.value = [];
27-
logger.warn('setSrcIdTblWithFileName: Missing or invalid srctbl field in JSON', { fileName });
28-
}
29-
} catch (error) {
30-
// If meta metadata is not found, just log and continue with empty source table
31-
logger.warn('setSrcIdTblWithFileName: Could not load meta metadata, source table will be empty', {
32-
fileName,
33-
error: error instanceof Error ? error.message : String(error)
34-
});
35-
sourceTable.value = [];
40+
sourceTable.value = []
41+
logger.warn('setSrcIdTblWithFileName: Missing or invalid srctbl field in JSON', {
42+
fileName
43+
})
44+
}
45+
} catch (error) {
46+
// If meta metadata is not found, just log and continue with empty source table
47+
logger.warn(
48+
'setSrcIdTblWithFileName: Could not load meta metadata, source table will be empty',
49+
{
50+
fileName,
51+
error: error instanceof Error ? error.message : String(error)
3652
}
53+
)
54+
if (reqId !== undefined) {
55+
sourceTables.value.set(reqId, [])
56+
}
57+
sourceTable.value = []
3758
}
59+
}
3860

39-
async function setSourceTbl(reqId:number){
40-
const fileName = await indexedDB.getFilename(reqId);
41-
return setSrcIdTblWithFileName(fileName);
42-
}
61+
async function setSourceTbl(reqId: number) {
62+
const fileName = await indexedDB.getFilename(reqId)
63+
return setSrcIdTblWithFileName(fileName, reqId)
64+
}
4365

44-
async function getUniqueSourceCount(req_id: number): Promise<number> {
45-
await setSourceTbl(req_id);
46-
return new Set(sourceTable.value).size;
47-
}
66+
async function getUniqueSourceCount(req_id: number): Promise<number> {
67+
await setSourceTbl(req_id)
68+
const table = sourceTables.value.get(req_id) || []
69+
return new Set(table).size
70+
}
4871

49-
async function getSourceTblForFile(fileName: string): Promise<string[]> {
50-
await setSrcIdTblWithFileName(fileName);
51-
return sourceTable.value;
52-
}
72+
async function getSourceTblForFile(fileName: string): Promise<string[]> {
73+
await setSrcIdTblWithFileName(fileName)
74+
return sourceTable.value
75+
}
76+
77+
function getSourceTableForReqId(reqId: number): string[] {
78+
return sourceTables.value.get(reqId) || []
79+
}
5380

54-
return {
55-
sourceTable,
56-
getUniqueSourceCount,
57-
getSourceTblForFile,
58-
};
59-
});
81+
return {
82+
sourceTable,
83+
sourceTables,
84+
getUniqueSourceCount,
85+
getSourceTblForFile,
86+
getSourceTableForReqId
87+
}
88+
})

web-client/src/utils/SrMapUtils.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -560,10 +560,10 @@ export function disableTagDisplay(): void {
560560
}
561561
}
562562

563-
export function formatElObject(obj: { [key: string]: any }): string {
563+
export function formatElObject(obj: { [key: string]: any }, reqId?: number): string {
564564
const html = Object.entries(obj)
565565
.filter(([key]) => key !== 'extent_id' && key !== '__rgba')
566-
.map(([key, value]) => formatKeyValuePair(key, value))
566+
.map(([key, value]) => formatKeyValuePair(key, value, reqId))
567567
.join('<br>')
568568
return html
569569
}
@@ -887,7 +887,9 @@ const onHoverHandler = isIPhone
887887

888888
if (analysisMapStore.showTheTooltip) {
889889
if (object && !useDeckStore().isDragging) {
890-
const tooltip = formatElObject(object)
890+
const recTreeStore = useRecTreeStore()
891+
const reqId = Number(recTreeStore.selectedReqIdStr)
892+
const tooltip = formatElObject(object, reqId)
891893

892894
const syntheticEvent = new MouseEvent('mousemove', {
893895
clientX: x,
@@ -897,7 +899,6 @@ const onHoverHandler = isIPhone
897899
view: window
898900
})
899901

900-
const recTreeStore = useRecTreeStore()
901902
analysisMapStore.tooltipRef.showTooltip(
902903
syntheticEvent,
903904
tooltip,

web-client/src/utils/formatUtils.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export function formatTime(value: number): string {
5757
return date.toISOString() // Format as ISO string in UTC
5858
}
5959

60-
export function formatKeyValuePair(key: string, value: any): string {
60+
export function formatKeyValuePair(key: string, value: any, reqId?: number): string {
6161
const srcIdStore = useSrcIdTblStore()
6262

6363
let formattedValue: string | number
@@ -92,8 +92,12 @@ export function formatKeyValuePair(key: string, value: any): string {
9292

9393
formattedValue = `[<br>${formattedPairs}<br>]`
9494
} else if (key === 'srcid') {
95-
if (srcIdStore.sourceTable.length - 1 >= value) {
96-
formattedValue = `${value}: ${srcIdStore.sourceTable[value]}`
95+
// Use reqId-specific source table if available, otherwise fall back to legacy sourceTable
96+
const sourceTable =
97+
reqId !== undefined ? srcIdStore.getSourceTableForReqId(reqId) : srcIdStore.sourceTable
98+
99+
if (sourceTable.length - 1 >= value) {
100+
formattedValue = `${value}: ${sourceTable[value]}`
97101
} else {
98102
formattedValue = `${value} : <unknown source>`
99103
}

web-client/src/utils/plotUtils.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -729,29 +729,31 @@ export function formatTooltip(
729729
) {
730730
const paramsData = params.data
731731
const paramsDim = params.dimensionNames as string[]
732+
const reqId = Number(reqIdStr)
732733
let ndx = 0
733734

734735
const parms = paramsDim
735736
.map((dim) => {
736737
const val = paramsData[ndx++]
737738
filterDataForPos(dim, val, latFieldName, lonFieldName)
738-
return formatKeyValuePair(dim, val)
739+
return formatKeyValuePair(dim, val, reqId)
739740
})
740741
.join('<br>')
741742

742743
// Add record ID as the first line
743744
const htmlWithRecordId = `<strong>Record ID</strong>: <em>${reqIdStr}</em><br>${parms}`
744745

745746
// Convert HTML to plain text for text export
747+
const srcIdStore = useSrcIdTblStore()
748+
const sourceTable = srcIdStore.getSourceTableForReqId(reqId)
746749
const textContent = paramsDim
747750
.map((dim, index) => {
748751
const val = paramsData[index]
749752
const plainKey = dim === 'srcid' ? 'granule' : dim
750753
let plainValue = String(val)
751754
if (dim === 'srcid') {
752-
const srcIdStore = useSrcIdTblStore()
753-
if (srcIdStore.sourceTable.length - 1 >= val) {
754-
plainValue = `${val}: ${srcIdStore.sourceTable[val]}`
755+
if (sourceTable.length - 1 >= val) {
756+
plainValue = `${val}: ${sourceTable[val]}`
755757
} else {
756758
plainValue = `${val}: <unknown source>`
757759
}

0 commit comments

Comments
 (0)