Subversion Repositories eFlore/Applications.del

Rev

Rev 1775 | Rev 1830 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1196 gduche 1
package org.tela_botanica.del.client.vues.identiplante.plateformedetermination;
2
 
3
import java.util.List;
4
 
5
import org.tela_botanica.del.client.cache.CacheClient;
6
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
7
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
8
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
9
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
10
import org.tela_botanica.del.client.composants.formulaires.formulaireproposition.FormulairePropositionPresenteur;
11
import org.tela_botanica.del.client.composants.formulaires.formulaireproposition.FormulairePropositionVue;
12
import org.tela_botanica.del.client.composants.metadonnees.MetadonneesEnLigneVue;
13
import org.tela_botanica.del.client.composants.metadonnees.MetadonneesPresenteur;
14
import org.tela_botanica.del.client.composants.observations.ObservationImagesPresenteur;
15
import org.tela_botanica.del.client.composants.observations.ObservationImagesVue;
16
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
17
import org.tela_botanica.del.client.composants.rss.RssPresenteur;
18
import org.tela_botanica.del.client.composants.rss.RssVue;
19
import org.tela_botanica.del.client.config.Config;
1257 aurelien 20
import org.tela_botanica.del.client.i18n.I18n;
1196 gduche 21
import org.tela_botanica.del.client.modeles.Image;
22
import org.tela_botanica.del.client.modeles.ModeRecherche;
23
import org.tela_botanica.del.client.modeles.MoyenneVote;
24
import org.tela_botanica.del.client.modeles.Observation;
25
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
1257 aurelien 26
import org.tela_botanica.del.client.modeles.PropositionDetermination;
27
import org.tela_botanica.del.client.modeles.Utilisateur;
1196 gduche 28
import org.tela_botanica.del.client.modeles.VoteDetermination;
29
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
30
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
31
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
32
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
33
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
1314 aurelien 34
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.EvenementChangementEtatUtilisateur;
35
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.GestionnaireEvenementChangementEtatUtilisateur;
1196 gduche 36
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.EvenementChangementImageValidation;
37
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.GestionnaireEvenementChangementImageValidation;
1689 jpm 38
import org.tela_botanica.del.client.navigation.evenement.depublierObs.EvenementDepublierObs;
39
import org.tela_botanica.del.client.navigation.evenement.depublierObs.GestionnaireEvenementDepublierObs;
1196 gduche 40
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.EvenementVoteDetermination;
41
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.GestionnaireEvenementVoteDetermination;
42
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
43
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
44
import org.tela_botanica.del.client.services.rest.ObservationService;
45
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
1689 jpm 46
import org.tela_botanica.del.client.services.rest.async.DepublicationObservationCallBack;
1196 gduche 47
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;
1257 aurelien 48
import org.tela_botanica.del.client.services.rest.async.ValidationPropositionCallback;
1775 aurelien 49
import org.tela_botanica.del.client.utils.ModerationUtils;
1196 gduche 50
import org.tela_botanica.del.client.utils.URLUtils;
1689 jpm 51
import org.tela_botanica.del.client.navigation.evenement.rechercheobservation.EvenementRechercheObservation;
1196 gduche 52
import org.tela_botanica.del.client.composants.formulairerechercheeflore.FormulaireRechercheEflorePresenteur;
53
import org.tela_botanica.del.client.composants.forum.ForumPresenteur;
54
import org.tela_botanica.del.client.composants.forum.ForumVue;
55
 
1689 jpm 56
import com.google.gwt.core.shared.GWT;
1196 gduche 57
import com.google.gwt.event.dom.client.ClickEvent;
58
import com.google.gwt.event.dom.client.ClickHandler;
59
import com.google.gwt.event.dom.client.HasClickHandlers;
60
import com.google.gwt.user.client.Window;
61
import com.google.gwt.user.client.ui.Button;
62
import com.google.gwt.user.client.ui.HasWidgets;
63
import com.google.gwt.user.client.ui.IsWidget;
64
import com.google.gwt.user.client.ui.Panel;
65
 
66
public class IdentiplanteDeterminationPresenteur extends Presenteur {
67
 
68
	/**
69
	 * Vue de l'interface de détermination
70
	 * */
71
	public interface Vue extends IsWidget {
72
		public Panel getForum();
73
 
74
		public Panel getDetailImageObservation();
75
 
76
		public Panel getFormulaireRechercheEflore();
77
 
78
		public Button getBoutonAjoutProposition();
79
 
80
		public Button getBoutonAjoutCommentaire();
81
 
82
		public Button getBoutonAjoutPropositionBas();
83
 
84
		public Button getBoutonAjoutCommentaireBas();
1689 jpm 85
 
86
		public HasClickHandlers getBoutonDepublierObs();
1196 gduche 87
 
88
		public HasWidgets getMetadonnees();
89
 
90
		public void afficherNomTaxonProbable(String nomTaxon);
91
 
92
		public HasClickHandlers getLienOuvrages();
93
 
94
		public HasClickHandlers getLienBonnier();
95
 
96
		public HasClickHandlers getLienCles();
97
 
98
		public HasClickHandlers getLienEflore();
99
 
100
		public HasWidgets getZoneRss();
1257 aurelien 101
 
102
		HasClickHandlers getBoutonValidationTaxon();
103
 
104
		void cacherBoutonValidationTaxon();
105
 
106
		void afficherBoutonValidationTaxon();
107
 
108
		public void viderMetadonnees();
1690 jpm 109
 
110
		void afficherZoneActionsObs();
111
 
112
		void cacherZoneActionsObs();
1196 gduche 113
	}
114
 
1689 jpm 115
	private Observation observation;
1196 gduche 116
	private Vue vue;
117
	private FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur;
118
 
119
	// Déclaration des services à utiliser
120
	private ObservationService observationService;
121
 
122
	private CacheClient cache = CacheClient.getInstance();
1257 aurelien 123
 
124
	private PropositionDetermination propositionPlusPopulaire;
1196 gduche 125
 
126
	public IdentiplanteDeterminationPresenteur(Vue vue, ObservationService observationService) {
127
		this.vue = vue;
128
		this.observationService = observationService;
129
	}
130
 
131
	public void go(final HasWidgets composite) {
132
		// TODO afficher une icone de chargement si le chargement devient trop
133
		// long
134
		// car tout l'écran est asynchrone ici
135
		String observationId = URLUtils.getURLSpecialParameterValue();
136
		observationService.getObservation(observationId, new ObservationsCallback() {
137
			@Override
138
			public void surRetour(ObservationServiceResultat objetRetour) {
1689 jpm 139
				observation = cache.getObservationCourante();
1196 gduche 140
				afficherRss(cache.getObservationCourante());
141
				// trouve l'image courante si elle n'est pas deja en cache
142
				List<Image> listeImages = cache.getObservationCourante().getImages();
143
				if (listeImages.size() > 0) {
144
					CacheClient.getInstance().setImageCourante(listeImages.get(0));
145
				} else {
146
					CacheClient.getInstance().setImageCourante(null);
147
				}
1314 aurelien 148
 
1196 gduche 149
				new MetadonneesPresenteur(new MetadonneesEnLigneVue(), cache.getObservationCourante(), ModeRecherche.MODE_OBSERVATION, false).go(vue.getMetadonnees());
1553 jpm 150
				new ObservationImagesPresenteur(new ObservationImagesVue(), cache.getObservationCourante(), CacheClient.getInstance().getImageCourante()).go(vue.getDetailImageObservation());
1196 gduche 151
				new ForumPresenteur(new ForumVue()).go(vue.getForum());
152
				new FormulaireRechercheEflorePresenteur().go(vue.getFormulaireRechercheEflore());
153
 
1314 aurelien 154
				composite.add(vue.asWidget());
1196 gduche 155
				calculerEtAfficherVoteDeterminationPlusPopulaire();
156
			}
157
 
158
			@Override
159
			public void surErreur(String messageErreur) {
1542 mathias 160
				Window.alert(messageErreur + " - l'identifiant d'observation est incorrect; l'observation a peut-être été supprimée");
1196 gduche 161
			}
162
		});
1690 jpm 163
		afficherZoneActionsObs();
1196 gduche 164
		gererEvenements();
165
	}
166
 
167
	public void afficherRss(Observation observation) {
168
		new RssPresenteur(new RssVue(), observation, "Suivre cette observation").go(vue.getZoneRss());
169
	}
170
 
171
	private void calculerEtAfficherVoteDeterminationPlusPopulaire() {
1689 jpm 172
		if (cache.getObservationCourante() != null) {
1393 aurelien 173
			Observation observation = cache.getObservationCourante();
174
			String nomTaxon = observation.getNomRetenuFormateReferentiel();
175
			List<MoyenneVote> votesOrdonnes = CalculVoteDeterminationService.calculerVoteDeterminationPlusPopulaire(cache.getObservationCourante().getPropositionDeterminations());
176
			if (votesOrdonnes.size() > 0) {
177
				nomTaxon = votesOrdonnes.get(0).getIntituleAssocie();
178
				propositionPlusPopulaire = votesOrdonnes.get(0).getPropositionAssociee();
179
 
1689 jpm 180
				if (doitAfficherBoutonValidation(votesOrdonnes)) {
1393 aurelien 181
					vue.afficherBoutonValidationTaxon();
182
				} else {
183
					vue.cacherBoutonValidationTaxon();
184
				}
1689 jpm 185
			}
1393 aurelien 186
			vue.afficherNomTaxonProbable(nomTaxon);
1196 gduche 187
		}
188
	}
1314 aurelien 189
 
190
	private boolean doitAfficherBoutonValidation(List<MoyenneVote> votesOrdonnes) {
191
		boolean estPropositionRetenue = votesOrdonnes.get(0).getPropositionAssociee().estPropositionRetenue();
1777 aurelien 192
		String numNomProp = votesOrdonnes.get(0).getPropositionAssociee().getNumNomenclatural();
193
		String referentielProp = votesOrdonnes.get(0).getPropositionAssociee().getReferentiel();
1314 aurelien 194
 
1777 aurelien 195
		boolean aUnNumNom = (numNomProp != null && !numNomProp.trim().equals("") && !numNomProp.trim().equals("0"));
196
		boolean aUnReferentiel = (referentielProp != null && !referentielProp.trim().equals("") && !referentielProp.trim().equals("0"));
197
 
1314 aurelien 198
		Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
1316 aurelien 199
		boolean estAuteurObservation = false;
200
		if(utilisateur != null) {
201
			estAuteurObservation = utilisateur.estIdentifie() && utilisateur.getId().equals(cache.getObservationCourante().getIdAuteur());
202
		}
1775 aurelien 203
		boolean peutValiderObservation = ModerationUtils.utilisateurPeutValiderObservation(CacheClient.getInstance().getUtilisateur(), observation);
1777 aurelien 204
		return (peutValiderObservation || estAuteurObservation) && aUnReferentiel && aUnNumNom && !estPropositionRetenue;
1314 aurelien 205
	}
1196 gduche 206
 
207
	public void gererEvenements() {
1314 aurelien 208
		BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
209
			@Override
210
			public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
211
				calculerEtAfficherVoteDeterminationPlusPopulaire();
212
			};
213
		});
214
 
1196 gduche 215
		BusEvenementiel.getInstance().addHandler(EvenementVoteDetermination.TYPE, new GestionnaireEvenementVoteDetermination() {
216
			@Override
217
			public void onVoteDetermination(VoteDetermination event) {
218
				calculerEtAfficherVoteDeterminationPlusPopulaire();
219
			}
220
		});
1689 jpm 221
 
1196 gduche 222
		BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
223
			@Override
224
			public void onAjoutDetermination(EvenementAjoutDetermination event) {
225
				if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
226
					fenetreOverlaySimplePresenteur.fermerFenetreModale();
227
				}
228
			}
229
		});
230
 
231
		BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
232
			@Override
233
			public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
234
				if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
235
					fenetreOverlaySimplePresenteur.fermerFenetreModale();
236
				}
237
			}
238
		});
239
 
240
		BusEvenementiel.getInstance().addHandler(EvenementChangementImageValidation.TYPE, new GestionnaireEvenementChangementImageValidation() {
241
			@Override
242
			public void onChangementImage(EvenementChangementImageValidation event) {
243
				vue.getDetailImageObservation().clear();
1553 jpm 244
				new ObservationImagesPresenteur(
245
					new ObservationImagesVue(),
246
					cache.getObservationCourante(),
247
					CacheClient.getInstance().getImageCourante()).go(vue.getDetailImageObservation());
1196 gduche 248
			}
249
		});
1689 jpm 250
 
251
		ClickHandler clicAjoutProposition = new ClickHandler() {
252
			@Override
253
			public void onClick(ClickEvent event) {
254
				fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
255
				fenetreOverlaySimplePresenteur.ouvrirFenetreModale(new FormulairePropositionPresenteur(new FormulairePropositionVue(), new PropositionDeterminationServiceConcret()));
256
			}
257
		};
258
		vue.getBoutonAjoutProposition().addClickHandler(clicAjoutProposition);
259
		vue.getBoutonAjoutPropositionBas().addClickHandler(clicAjoutProposition);
260
 
261
		ClickHandler clicAjoutCommentaire = new ClickHandler() {
262
			@Override
263
			public void onClick(ClickEvent event) {
264
				FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(cache.getObservationCourante(), new CommentaireServiceConcret(), new FormulaireCommentaireVue());
265
				fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
266
				fenetreOverlaySimplePresenteur.ouvrirFenetreModale(commentairePresenteur);
267
			}
268
		};
269
		vue.getBoutonAjoutCommentaire().addClickHandler(clicAjoutCommentaire);
270
		vue.getBoutonAjoutCommentaireBas().addClickHandler(clicAjoutCommentaire);
271
 
1196 gduche 272
		vue.getLienOuvrages().addClickHandler(new ClickHandler() {
273
			@Override
274
			public void onClick(ClickEvent event) {
275
				Config config = new Config();
1687 mathias 276
				Window.open(config.getUrl("ouvragesFlore"), "Flores numérisées", config.getInfo("popupOptions"));
1196 gduche 277
			}
278
		});
279
 
280
		vue.getLienBonnier().addClickHandler(new ClickHandler() {
281
			@Override
282
			public void onClick(ClickEvent event) {
283
				Config config = new Config();
1687 mathias 284
				Window.open(config.getUrl("bonnierPda"), "Flore Bonnier PDA", config.getInfo("popupOptions"));
1196 gduche 285
			}
286
		});
287
 
288
		vue.getLienCles().addClickHandler(new ClickHandler() {
289
			@Override
290
			public void onClick(ClickEvent event) {
291
				Config config = new Config();
1687 mathias 292
				Window.open(config.getUrl("clesDetermination"), "Clés de determination", config.getInfo("popupOptions"));
1196 gduche 293
			}
294
		});
295
 
296
		vue.getLienEflore().addClickHandler(new ClickHandler() {
297
			@Override
298
			public void onClick(ClickEvent event) {
299
				Config config = new Config();
1687 mathias 300
				Window.open(config.getUrl("eflore"), "eFlore", config.getInfo("popupOptions"));
1196 gduche 301
			}
302
		});
1257 aurelien 303
 
304
		vue.getBoutonValidationTaxon().addClickHandler(new ClickHandler() {
305
			@Override
306
			public void onClick(ClickEvent event) {
1689 jpm 307
				if (Window.confirm(I18n.getVocabulary().confirmationValidationDetermination())) {
1257 aurelien 308
					validerPropositionPlusPopulaire();
309
				}
310
			}
311
		});
1689 jpm 312
 
313
		vue.getBoutonDepublierObs().addClickHandler(new ClickHandler() {
314
			@Override
315
			public void onClick(ClickEvent event) {
316
				GWT.log("Lancer evnt : EvenementDepublierObs");
1690 jpm 317
				if (Window.confirm(I18n.getVocabulary().confirmationDepublicationObs())) {
318
					BusEvenementiel.getInstance().fireEvent(new EvenementDepublierObs(observation.getId()));
319
				}
1689 jpm 320
			}
321
		});
322
 
323
		BusEvenementiel.getInstance().addHandler(EvenementDepublierObs.TYPE, new GestionnaireEvenementDepublierObs() {
324
			@Override
325
			public void onDepublicationObs(EvenementDepublierObs event) {
326
				GWT.log("Attraper evnt : EvenementDepublierObs (obs:"+event.getIdObs()+")");
327
				if (event.getIdObs().equals(observation.getId())) {
1690 jpm 328
					depublierObs();
1689 jpm 329
				}
330
			}
331
		});
1690 jpm 332
 
333
		BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
334
			@Override
335
			public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
336
				afficherZoneActionsObs();
337
			}
338
		});
1196 gduche 339
	}
1257 aurelien 340
 
341
	private void validerPropositionPlusPopulaire() {
342
		PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
1775 aurelien 343
		propositionPlusPopulaire.setValideePar(CacheClient.getInstance().getUtilisateur().getId());
1257 aurelien 344
		propositionService.validerProposition(propositionPlusPopulaire, new ValidationPropositionCallback() {
345
			@Override
346
			public void surRetour(String objetRetour) {
347
				String observationId = URLUtils.getURLSpecialParameterValue();
348
				observationService.getObservation(observationId, new ObservationsCallback() {
349
 
350
					@Override
351
					public void surRetour(ObservationServiceResultat objetRetour) {
352
						vue.viderMetadonnees();
353
						new MetadonneesPresenteur(new MetadonneesEnLigneVue(), cache.getObservationCourante(), ModeRecherche.MODE_OBSERVATION, false).go(vue.getMetadonnees());
354
						calculerEtAfficherVoteDeterminationPlusPopulaire();
355
					}
356
 
357
					@Override
358
					public void surErreur(String messageErreur) {
359
						Window.alert(messageErreur);
360
					}
361
				});
362
			}
363
		});
364
	}
1689 jpm 365
 
366
	private void depublierObs() {
1690 jpm 367
		if (avoirUtilisateurAdmin()) {
368
			GWT.log("depublierObs :"+observation.getId());
369
			observationService.depublier(observation, new DepublicationObservationCallBack() {
370
 
371
				@Override
372
				public void surRetour(String depublicationOk) {
373
					GWT.log("Dépublication obs "+observation.getId()+" "+depublicationOk);
374
					if (depublicationOk.equals("OK")) {
375
						BusEvenementiel.getInstance().fireEvent(new EvenementRechercheObservation());
376
					}
1689 jpm 377
				}
1690 jpm 378
			});
379
		}
1689 jpm 380
	}
1690 jpm 381
 
382
	private void afficherZoneActionsObs() {
383
		if (avoirUtilisateurAdmin()) {
384
			vue.afficherZoneActionsObs();
385
		} else {
386
			vue.cacherZoneActionsObs();
387
		}
388
	}
389
 
390
	private boolean avoirUtilisateurAdmin() {
391
		Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
392
		boolean etreAdmin = false;
393
		if (utilisateur != null) {
394
			etreAdmin = utilisateur.estIdentifie() && utilisateur.etreAdmin();
395
		}
396
		return etreAdmin;
397
	}
1196 gduche 398
}