-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprincipal.multi
More file actions
282 lines (194 loc) · 10.4 KB
/
Copy pathprincipal.multi
File metadata and controls
282 lines (194 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
# MotusArtium - GraphQL-first bridge to reactive UI state
importer ui.composants.barre_recherche
importer ui.composants.panneau_detail
importer ui.composants.recit
importer ui.composants.panneau_comparaison
importer ui.composants.trajectoire
importer ui.composants.grille_themes
importer ui.composants.atelier_requete
importer ui.interactions.recherche
importer ui.interactions.navigation
importer ui.etat
importer ui.i18n
importer donnees.requetes
importer donnees.normalisation
importer ui.visualisations.polyglot_studio_vue
importer ui.visualisations.chronologie_vue
importer ui.visualisations.graphe_vue
importer ui.composants.session_requete
importer ui.composants.curseur_temps
importer semantique.intersections
importer ui.visualisations.heatmap_vue
importer ui.visualisations.empreinte_vue
importer semantique.empreinte
importer utilitaires.media
# ui.etat is intentionally owned by Multilingual. The browser shell may keep a
# temporary compatibility fallback, but new application state belongs here.
asynchrone déf charger_mouvement(mouvement_id):
"""Charger un mouvement et retour l'entité sélectionnée"""
attendre ui.etat.charger_mouvement(mouvement_id)
ui.etat.obtenir_entite_selectionnee()
asynchrone déf charger_musee(musee_id):
"""Charger un musée et retour l'entité sélectionnée"""
attendre ui.etat.charger_musee(musee_id)
ui.etat.obtenir_entite_selectionnee()
asynchrone déf charger_sujet(sujet_id):
"""Charger les oeuvres d'un sujet thematique"""
attendre ui.etat.charger_sujet(sujet_id)
ui.etat.obtenir_entite_selectionnee()
asynchrone déf charger_artiste(artiste_id):
"""Charger un artiste et retour l'entité sélectionnée"""
attendre ui.etat.charger_artiste(artiste_id)
ui.etat.obtenir_entite_selectionnee()
asynchrone déf charger_oeuvre(oeuvre_id):
"""Charger une œuvre et retour l'entité sélectionnée"""
attendre ui.etat.charger_oeuvre(oeuvre_id)
ui.etat.obtenir_entite_selectionnee()
asynchrone déf charger_chronologie(debut, fin):
"""Charger une chronologie et retour un instantané d'état"""
attendre ui.etat.charger_chronologie(debut, fin)
ui.etat.obtenir_instantane_etat()
asynchrone déf basculer_visualisation(mode):
"""Basculer le mode de visualisation"""
attendre ui.etat.basculer_visualisation(mode)
ui.etat.obtenir_instantane_etat()
asynchrone déf basculer_langue(langue):
"""Basculer entre les langues"""
attendre ui.etat.basculer_langue(langue)
déf basculer_affichage_surfaces():
"""Basculer l'affichage des surfaces polyglot (cote-a-cote vs onglets)"""
ui.etat.basculer_affichage_surfaces()
asynchrone déf principal():
"""Point d'entrée principal de l'application"""
attendre initialiser_application()
ui.etat.obtenir_instantane_etat()
asynchrone déf initialiser_application():
"""Initialiser l'application avec un mouvement de départ"""
attendre ui.etat.charger_mouvement("Q40415")
# ============================================================================
# Recherche et navigation
# ============================================================================
asynchrone déf rechercher_entites(requete: chaine) -> liste:
"""Rechercher des entités (cache + Wikidata) et retourner les résultats normalisés pour le shell JS"""
si non requete ou len(requete) < 2:
retour []
carte_types = {"mouvement": "movement", "artiste": "artist", "oeuvre": "artwork"}
resultats_cache = ui.interactions.recherche._rechercher_cache(requete)
resultats_wikidata = attendre donnees.requetes.rechercher_entites_wikidata(requete)
entites_vues = {}
resultats = []
pour r dans resultats_cache + resultats_wikidata:
cle = r.obtenir("id", "")
si cle et cle non dans entites_vues:
entites_vues[cle] = vrai
resultats.ajouter({
"id": cle,
"label": r.obtenir("label", cle),
"description": r.obtenir("description", ""),
"entityType": carte_types.obtenir(r.obtenir("type", ""), "")
})
retour resultats
asynchrone déf lancer_recherche(requete):
"""Lancer une recherche textuelle"""
attendre ui.interactions.recherche.lancer_recherche(requete)
asynchrone déf ouvrir_barre_recherche():
"""Ouvrir la barre de recherche"""
attendre ui.interactions.recherche.ouvrir_barre_recherche()
asynchrone déf fermer_barre_recherche():
"""Fermer la barre de recherche"""
attendre ui.interactions.recherche.fermer_barre_recherche()
asynchrone déf resoudre_type_entite(entite_id, type_par_defaut):
"""Résoudre le type d'une entité via les claims Wikidata"""
retour attendre ui.interactions.recherche.resoudre_type_entite(entite_id, type_par_defaut)
asynchrone déf resoudre_entree_directe(terme, langue):
"""Résoudre une entrée directe (URL Wikipedia, identifiant d'autorité, Q-id)"""
retour attendre ui.interactions.recherche.resoudre_entree_directe(terme, langue)
asynchrone déf charger_selection(entite_id, type_en, etiquette):
"""Charger une sélection de recherche et naviguer"""
attendre ui.interactions.navigation.charger_selection(entite_id, type_en, etiquette)
# ============================================================================
# Panneau de détails
# ============================================================================
asynchrone déf ouvrir_panneau_detail():
"""Ouvrir le panneau de détails"""
attendre ui.composants.panneau_detail.ouvrir_panneau_detail()
asynchrone déf fermer_panneau_detail():
"""Fermer le panneau de détails"""
attendre ui.composants.panneau_detail.fermer_panneau_detail()
déf rendre_panneau_detail():
"""Rendre le panneau de détails depuis le composant Multilingual"""
retour ui.composants.panneau_detail.rendre_panneau_detail()
déf rendre_barre_recherche():
"""Rendre la barre de recherche depuis le composant Multilingual"""
retour ui.composants.barre_recherche.rendre_barre_recherche()
# ============================================================================
# Pagination curseur — re-exports depuis ui.etat
# ============================================================================
asynchrone déf charger_mouvement_artistes_page_suivante():
"""Charger la page suivante d'artistes pour le mouvement courant"""
retour attendre ui.etat.charger_mouvement_artistes_page_suivante()
asynchrone déf charger_artiste_oeuvres_page_suivante():
"""Charger la page suivante d'œuvres pour l'artiste courant"""
retour attendre ui.etat.charger_artiste_oeuvres_page_suivante()
asynchrone déf charger_musee_oeuvres_page_suivante():
"""Charger la page suivante d'œuvres pour le musée courant"""
retour attendre ui.etat.charger_musee_oeuvres_page_suivante()
# ============================================================================
# Récit Mode — re-exports depuis ui.composants.recit
# ============================================================================
déf rendre_recit():
"""Rendre le récit narratif de l'entité sélectionnée"""
retour ui.composants.recit.rendre_recit()
asynchrone déf basculer_mode_recit():
"""Basculer le mode récit dans la visualisation"""
attendre ui.etat.basculer_visualisation("recit")
retour ui.etat.obtenir_instantane_etat()
# ============================================================================
# Comparaison — re-exports depuis ui.etat et ui.composants.panneau_comparaison
# ============================================================================
déf rendre_panneau_comparaison():
"""Rendre le panneau de comparaison entre entités"""
retour ui.composants.panneau_comparaison.rendre_panneau_comparaison()
asynchrone déf basculer_comparaison(entite_id: chaine, type_entite: chaine, etiquette: chaine):
"""Ajouter ou retirer une entité du panneau de comparaison, puis charger ses données"""
ui.etat.basculer_comparaison(entite_id, type_entite, etiquette)
attendre ui.etat.charger_donnees_comparaison(entite_id, type_entite)
déf effacer_comparaison():
"""Vider le panneau de comparaison"""
ui.etat.effacer_comparaison()
# ============================================================================
# Trajectoire d'Influence — re-exports depuis ui.etat et ui.composants.trajectoire
# ============================================================================
déf rendre_trajectoire():
"""Rendre le panneau de trajectoire d'influence entre deux artistes"""
retour ui.composants.trajectoire.rendre_trajectoire()
asynchrone déf basculer_artiste_trajectoire(artiste_id: chaine, etiquette: chaine):
"""Définir le départ ou l'arrivée de la trajectoire, lancer la recherche si les deux sont définis"""
retour attendre ui.etat.basculer_artiste_trajectoire(artiste_id, etiquette)
asynchrone déf trouver_trajectoire_influence(depart_id: chaine, arrivee_id: chaine):
"""Trouver le chemin d'influence entre deux artistes"""
retour attendre ui.etat.trouver_trajectoire_influence(depart_id, arrivee_id)
déf effacer_trajectoire():
"""Vider la trajectoire d'influence"""
ui.etat.effacer_trajectoire()
# ============================================================================
# Grille de themes — re-export depuis ui.composants.grille_themes
# ============================================================================
déf rendre_grille_themes():
"""Rendre la grille de tuiles thematiques pour le mode Story"""
retour ui.composants.grille_themes.rendre_grille_themes()
# ============================================================================
# Atelier de Requête — re-export depuis ui.composants.atelier_requete
# ============================================================================
déf rendre_atelier():
"""Rendre l'Atelier de Requête à facettes (searchItems AND)"""
retour ui.composants.atelier_requete.rendre_atelier()
# ============================================================================
# I18n — re-exports depuis ui.i18n
# ============================================================================
asynchrone déf charger_textes_interface():
"""Charger les textes d'interface depuis les fichiers JSON de locales."""
retour attendre ui.i18n.charger_textes_interface()
déf obtenir_texte_interface(cle: chaine, langue: chaine = "fr") -> chaine:
"""Retourner un texte d'interface localise."""
retour ui.i18n.obtenir_texte(cle, langue)