Skip to content

Commit bb5a485

Browse files
committed
exports and imports OK
1 parent f6c1304 commit bb5a485

File tree

4 files changed

+86
-71
lines changed

4 files changed

+86
-71
lines changed

composables/project_manager.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,19 @@ export function useProjectManager() {
3737

3838
const infra = useInfraStore()
3939
await infra.create_connection()
40+
const schemaImport = back_schemas.opengeodeweb_back.import_project || {}
4041

4142
const form = new FormData()
42-
form.append("file", file, file.name || "project.zip")
43+
form.append("file", file, file?.name || "project.zip")
4344

44-
const importPath =
45-
back_schemas.opengeodeweb_back.import_project?.$id ||
46-
"opengeodeweb_back/import_project"
47-
48-
const result = await $fetch(importPath, {
45+
const result = await $fetch(schemaImport.$id, {
4946
baseURL: geode.base_url,
5047
method: "POST",
5148
body: form,
5249
})
53-
console.log(
54-
"[ProjectManager] snapshot keys:",
55-
Object.keys(result?.snapshot || {}),
56-
)
50+
51+
const snapshot = result?.snapshot ?? {}
52+
console.log("[ProjectManager] snapshot keys:", Object.keys(snapshot || {}))
5753

5854
await viewer_call({
5955
schema: viewer_schemas.opengeodeweb_viewer.import_project,
@@ -68,13 +64,14 @@ export function useProjectManager() {
6864
treeviewStore.isImporting = true
6965
console.log("[ProjectManager] isImporting = true")
7066

71-
await appStore.importStores(result.snapshot)
67+
await appStore.importStores(snapshot)
7268
console.log("[ProjectManager] stores imported")
7369

7470
const dataStyleStore = useDataStyleStore()
7571
await dataStyleStore.applyAllStylesFromState()
7672
console.log("[ProjectManager] styles applied")
7773

74+
treeviewStore.finalizeImportSelection()
7875
treeviewStore.isImporting = false
7976
console.log("[ProjectManager] isImporting = false")
8077
} finally {

stores/data_base.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ export const useDataBaseStore = defineStore("dataBase", () => {
4747
params: { id },
4848
})
4949
}
50+
51+
const treeviewStore = useTreeviewStore()
52+
const hybridViewerStore = useHybridViewerStore()
5053

5154
async function addItem(
5255
id,
@@ -71,7 +74,7 @@ export const useDataBaseStore = defineStore("dataBase", () => {
7174
await fetchUuidToFlatIndexDict(id)
7275
}
7376

74-
treeview_store.addItem(
77+
treeviewStore.addItem(
7578
value.geode_object,
7679
value.displayed_name,
7780
id,
@@ -80,8 +83,7 @@ export const useDataBaseStore = defineStore("dataBase", () => {
8083
console.log("[DataBase] addItem -> treeview.addItem done", id)
8184

8285
console.log("[DataBase] addItem -> hybridViewer.addItem start", id)
83-
// Ajout viewer (potentiellement asynchrone)
84-
await hybridViewerStore.addItem(id, value.vtk_js)
86+
await hybridViewerStore.addItem(id)
8587
console.log("[DataBase] addItem -> hybridViewer.addItem done", id)
8688
}
8789

@@ -116,13 +118,29 @@ export const useDataBaseStore = defineStore("dataBase", () => {
116118
)
117119
}
118120

121+
function exportStores() {
122+
const snapshotDb = {}
123+
for (const [id, item] of Object.entries(db)) {
124+
if (!item) continue
125+
snapshotDb[id] = {
126+
object_type: item.object_type,
127+
geode_object: item.geode_object,
128+
native_filename: item.native_filename,
129+
viewable_filename: item.viewable_filename,
130+
displayed_name: item.displayed_name,
131+
vtk_js: {
132+
binary_light_viewable: item?.vtk_js?.binary_light_viewable,
133+
},
134+
}
135+
}
136+
return { db: snapshotDb }
137+
}
138+
119139
async function importStores(snapshot) {
120-
const entries = snapshot?.db || {}
121-
const hybrid_store = useHybridViewerStore()
122-
await hybrid_store.initHybridViewer()
123-
hybrid_store.clear()
124-
console.log("[DataBase] importStores entries:", Object.keys(entries))
125-
for (const [id, item] of Object.entries(entries)) {
140+
await hybridViewerStore.initHybridViewer()
141+
hybridViewerStore.clear()
142+
console.log("[DataBase] importStores entries:", Object.keys(snapshot?.db || {}))
143+
for (const [id, item] of Object.entries(snapshot?.db || {})) {
126144
await registerObject(id)
127145
await addItem(id, item)
128146
}
@@ -169,7 +187,7 @@ export const useDataBaseStore = defineStore("dataBase", () => {
169187
getSurfacesUuids,
170188
getBlocksUuids,
171189
getFlatIndexes,
172-
exportStores,
190+
exportStores, // maintenant défini
173191
importStores,
174192
}
175193
})

stores/data_style.js

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ export const useDataStyleStore = defineStore("dataStyle", () => {
1515
}
1616

1717
function setVisibility(id, visibility) {
18-
console.log(
19-
"dataBaseStore.itemMetaDatas(id)",
20-
dataBaseStore.itemMetaDatas(id),
21-
)
22-
const object_type = dataBaseStore.itemMetaDatas(id).object_type
18+
const meta = dataBaseStore.itemMetaDatas(id)
19+
if (!meta) {
20+
console.warn("[DataStyle] setVisibility skipped: unknown id", id)
21+
return Promise.resolve([])
22+
}
23+
const object_type = meta.object_type
2324
if (object_type === "mesh") {
2425
return Promise.all([meshStyleStore.setMeshVisibility(id, visibility)])
2526
} else if (object_type === "model") {
@@ -33,18 +34,13 @@ export const useDataStyleStore = defineStore("dataStyle", () => {
3334
if (object_type === "mesh") {
3435
return meshStyleStore.applyMeshStyle(id)
3536
} else if (object_type === "model") {
36-
return Promise.all([modelStyleStore.setModelVisibility(id, visible)])
37+
return modelStyleStore.applyModelStyle(id)
3738
}
3839
return Promise.resolve([])
3940
}
4041

4142
function setModelEdgesVisibility(id, visibility) {
42-
modelStyleStore.setModelMeshComponentVisibility(
43-
id,
44-
"Edge",
45-
null,
46-
visibility,
47-
)
43+
modelStyleStore.setModelMeshComponentVisibility(id, "Edge", null, visibility)
4844
}
4945

5046
function modelEdgesVisibility(id) {
@@ -57,52 +53,25 @@ export const useDataStyleStore = defineStore("dataStyle", () => {
5753

5854
async function importStores(snapshot) {
5955
const stylesSnapshot = snapshot?.styles || {}
60-
console.log(
61-
"[DataStyle] importStores snapshot ids:",
62-
Object.keys(stylesSnapshot),
63-
)
64-
65-
// Conserver la référence réactive -> clear + merge
66-
for (const id of Object.keys(dataStyleState.styles))
67-
delete dataStyleState.styles[id]
56+
for (const id of Object.keys(dataStyleState.styles)) delete dataStyleState.styles[id]
6857
for (const [id, style] of Object.entries(stylesSnapshot)) {
6958
dataStyleState.styles[id] = style
7059
}
71-
console.log(
72-
"[DataStyle] importStores merged ids:",
73-
Object.keys(dataStyleState.styles),
74-
)
7560
}
7661

7762
async function applyAllStylesFromState() {
7863
const ids = Object.keys(dataStyleState.styles || {})
79-
console.log("[DataStyle] applyAllStylesFromState start ids:", ids)
80-
81-
// Séquentiel par id pour mieux tracer et éviter les courses
8264
for (const id of ids) {
8365
const meta = dataBaseStore.itemMetaDatas(id)
8466
const objectType = meta?.object_type
8567
const style = dataStyleState.styles[id]
86-
if (!style || !objectType) {
87-
console.warn("[DataStyle] applyAllStylesFromState skip:", {
88-
id,
89-
hasStyle: !!style,
90-
objectType,
91-
})
92-
continue
93-
}
94-
console.log("[DataStyle] applyAllStylesFromState applying:", {
95-
id,
96-
objectType,
97-
})
68+
if (!style || !objectType) continue
9869
if (objectType === "mesh") {
99-
await meshStyleStore.applyMeshDefaultStyle(id)
70+
await meshStyleStore.applyMeshStyle(id)
10071
} else if (objectType === "model") {
101-
await modelStyleStore.applyModelDefaultStyle(id)
72+
await modelStyleStore.applyModelStyle(id)
10273
}
103-
console.log("[DataStyle] applyAllStylesFromState applied:", id)
10474
}
105-
console.log("[DataStyle] applyAllStylesFromState finished")
10675
}
10776

10877
return {
@@ -112,5 +81,10 @@ export const useDataStyleStore = defineStore("dataStyle", () => {
11281
addDataStyle,
11382
applyDefaultStyle,
11483
setVisibility,
84+
setModelEdgesVisibility,
85+
modelEdgesVisibility,
86+
exportStores,
87+
importStores,
88+
applyAllStylesFromState,
11589
}
11690
})

stores/treeview.js

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
export const useTreeviewStore = defineStore("treeview", () => {
2-
const dataStyleStore = useDataStyleStore()
3-
const dataBaseStore = useDataBaseStore()
4-
52
const items = ref([])
63
const selection = ref([])
74
const components_selection = ref([])
@@ -10,6 +7,9 @@ export const useTreeviewStore = defineStore("treeview", () => {
107
const model_id = ref("")
118
const isTreeCollection = ref(false)
129
const selectedTree = ref(null)
10+
const isImporting = ref(false)
11+
// Buffer pour reconstruire la sélection après que les items soient recréés
12+
const pendingSelectionIds = ref([])
1313

1414
// /** Functions **/
1515
function addItem(geodeObject, displayed_name, id, object_type) {
@@ -24,12 +24,17 @@ export const useTreeviewStore = defineStore("treeview", () => {
2424
sensitivity: "base",
2525
}),
2626
)
27-
selection.value.push(child)
27+
// Ne pas polluer la sélection pendant import; on la reconstruit ensuite
28+
if (!isImporting.value) {
29+
selection.value.push(child)
30+
}
2831
return
2932
}
3033
}
3134
items.value.push({ title: geodeObject, children: [child] })
32-
selection.value.push(child)
35+
if (!isImporting.value) {
36+
selection.value.push(child)
37+
}
3338
}
3439

3540
function displayAdditionalTree(id) {
@@ -60,18 +65,38 @@ export const useTreeviewStore = defineStore("treeview", () => {
6065
model_id: model_id.value,
6166
isTreeCollection: isTreeCollection.value,
6267
selectedTree: selectedTree.value,
63-
selection: selection.value,
68+
// Exporter uniquement les IDs pour éviter les problèmes de référence
69+
selectionIds: selection.value.map((c) => c.id),
6470
}
6571
}
6672

6773
async function importStores(snapshot) {
68-
selection.value = snapshot?.selection || []
74+
// Charger l’état UI
6975
isAdditionnalTreeDisplayed.value =
7076
snapshot?.isAdditionnalTreeDisplayed || false
7177
panelWidth.value = snapshot?.panelWidth || 300
7278
model_id.value = snapshot?.model_id || ""
7379
isTreeCollection.value = snapshot?.isTreeCollection || false
7480
selectedTree.value = snapshot?.selectedTree || null
81+
82+
// Bufferiser les IDs de sélection (compat v1: snapshot.selection -> ids)
83+
pendingSelectionIds.value =
84+
snapshot?.selectionIds ||
85+
(snapshot?.selection || []).map((c) => c.id) ||
86+
[]
87+
}
88+
89+
// Appeler après import pour reconstruire la sélection à partir des items
90+
function finalizeImportSelection() {
91+
const ids = pendingSelectionIds.value || []
92+
const rebuilt = []
93+
for (const group of items.value) {
94+
for (const child of group.children) {
95+
if (ids.includes(child.id)) rebuilt.push(child)
96+
}
97+
}
98+
selection.value = rebuilt
99+
pendingSelectionIds.value = []
75100
}
76101

77102
return {
@@ -90,5 +115,6 @@ export const useTreeviewStore = defineStore("treeview", () => {
90115
setPanelWidth,
91116
exportStores,
92117
importStores,
118+
finalizeImportSelection,
93119
}
94120
})

0 commit comments

Comments
 (0)