Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1940 aurelien 1
package org.tela_botanica.client.util;
2
 
1967 aurelien 3
import java.util.ArrayList;
1940 aurelien 4
import java.util.HashMap;
5
import java.util.Iterator;
1967 aurelien 6
import java.util.List;
1940 aurelien 7
import java.util.Map;
8
 
9
import org.tela_botanica.client.interfaces.Rafraichissable;
10
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
2033 aurelien 11
import org.tela_botanica.client.modeles.objets.ListeGroupesChampsEtendus;
2606 aurelien 12
import org.tela_botanica.client.modeles.objets.Utilisateur;
2602 aurelien 13
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;
1940 aurelien 14
 
2392 aurelien 15
import com.google.gwt.core.client.Callback;
2602 aurelien 16
import com.google.gwt.event.dom.client.ChangeEvent;
17
import com.google.gwt.event.dom.client.ChangeHandler;
18
import com.google.gwt.http.client.Response;
1940 aurelien 19
import com.google.gwt.user.client.Window;
1945 aurelien 20
import com.google.gwt.user.client.ui.HTML;
1940 aurelien 21
import com.google.gwt.user.client.ui.HorizontalPanel;
2602 aurelien 22
import com.google.gwt.user.client.ui.Label;
23
import com.google.gwt.user.client.ui.ListBox;
1940 aurelien 24
import com.gwtext.client.core.EventCallback;
25
import com.gwtext.client.core.EventObject;
2392 aurelien 26
import com.gwtext.client.core.Ext;
1940 aurelien 27
import com.gwtext.client.widgets.Button;
2033 aurelien 28
import com.gwtext.client.widgets.Panel;
1940 aurelien 29
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
30
import com.gwtext.client.widgets.form.FormPanel;
2033 aurelien 31
import com.gwtext.client.widgets.layout.FormLayout;
1940 aurelien 32
 
33
@SuppressWarnings("unchecked")
34
public abstract class FormulaireSaisieChampEtendu extends FormPanel implements Rafraichissable {
35
 
2602 aurelien 36
	final AutoCompletionComboBox nChamp;
1945 aurelien 37
	Button ajouterChampsEtenduEtFermer;
38
	Button ajouterChampsEtendu;
39
	Button annulerAjouterChampEtendu;
1940 aurelien 40
	String idChamp = null;
41
 
2033 aurelien 42
	Panel conteneurGroupesChampsEtendus;
2602 aurelien 43
	Panel conteneurlabelGroupe;
44
	ListBox listeGroupeChampsEtendus;
2033 aurelien 45
	HTML indicationSaisieGroupe;
1967 aurelien 46
 
2033 aurelien 47
	private static ListeGroupesChampsEtendus cacheGroupes;
2602 aurelien 48
	private static Map<String, String> cacheLabelsCle;
2033 aurelien 49
 
2392 aurelien 50
	private HTML descriptionChamp = null;
2602 aurelien 51
    private String groupeSelectionne = null;
2392 aurelien 52
 
1940 aurelien 53
	public FormulaireSaisieChampEtendu() {
54
		super();
55
		setPaddings(3);
56
		setBodyBorder(false);
57
 
2033 aurelien 58
		indicationSaisieGroupe = new HTML("Vous pouvez ajouter plusieurs champs à la fois correspondant à un groupe "+
59
				"par exemple les champs des projet 'sauvages de ma rue' ou 'florilèges', etc... <br />"+
60
				"De nouveaux groupes seront ajoutés régulièrement en fonction des champs les plus utilisés");
1967 aurelien 61
		indicationSaisieGroupe.addStyleName("aideCreerChampEtendu");
62
 
2602 aurelien 63
		conteneurlabelGroupe = new Panel();
64
		conteneurlabelGroupe.setStyleName("panneauEnLigne");
65
		conteneurlabelGroupe.addStyleName("selecteurGroupeEtendus");
66
		conteneurlabelGroupe.setBorder(false);
67
		Label labelGroupeChampsEtendus = new Label("Ajouter un groupe de champs :");
68
		listeGroupeChampsEtendus = new ListBox();
69
		listeGroupeChampsEtendus.setWidth("315px");
70
		conteneurlabelGroupe.add(labelGroupeChampsEtendus);
71
		conteneurlabelGroupe.add(listeGroupeChampsEtendus);
1967 aurelien 72
 
2033 aurelien 73
		conteneurGroupesChampsEtendus = new Panel();
74
		conteneurGroupesChampsEtendus.setBorder(false);
75
		conteneurGroupesChampsEtendus.setPaddings(0);
76
		conteneurGroupesChampsEtendus.setMargins(0);
77
		conteneurGroupesChampsEtendus.setLayout(new FormLayout());
78
		conteneurGroupesChampsEtendus.setWidth("100%");
79
 
80
		add(conteneurGroupesChampsEtendus);
81
 
82
		if(cacheGroupes == null) {
83
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
84
			lrceDao.obtenirGroupesChampsEtendus(this);
85
		} else {
86
			this.rafraichir(cacheGroupes, false);
1967 aurelien 87
		}
2033 aurelien 88
 
1945 aurelien 89
		HTML indicationSaisie = new HTML("Saisissez un nom de champ ou choisisez un nom proposé par l'autocomplétion "+
90
				"Si vous choissisez un nom de champ existant vous pourrez profiter d'une autocomplétion "+
2392 aurelien 91
				"sur les valeurs déjà saisies pour ce champ par les autres utilisateurs.<br /> "+
92
				"Les champs de la forme 'label (clé)' sont des champs 'standards' ayant un rôle et une description " +
93
				"bien définie");
1945 aurelien 94
		indicationSaisie.addStyleName("aideCreerChampEtendu");
95
		add(indicationSaisie);
96
 
1940 aurelien 97
		HorizontalPanel hp = new HorizontalPanel();
98
		hp.setBorderWidth(0);
2602 aurelien 99
 
100
 
101
		nChamp = new AutoCompletionComboBox("Nom du champ", ListeReferentielChampsEtendusDAO.getUrlRequeteNomsChampsEtendus()) {
102
			@Override
103
			protected Map<String, String> parserResultatRequete(
104
					Response response) {
105
				Map<String, String> clesLabels = ListeReferentielChampsEtendusDAO.parserRetourListeNomsChampsEtendus(response);
106
				cacheLabelsCle = new HashMap<String, String>();
107
				for(Map.Entry<String, String> entry : clesLabels.entrySet()){
108
					cacheLabelsCle.put(entry.getValue(), entry.getKey());
109
				}
110
				return clesLabels;
111
			}
112
 
113
			@Override
114
			protected void onSelectionValeur() {
115
				telechargerEtAfficherDescriptionChamps(cacheLabelsCle.get(nChamp.getRawValue()));
116
			}
117
 
118
			@Override
119
			protected void onValidationSaisie() {
120
				// rien à faire ici
121
			}
122
 
123
			@Override
124
			protected void onModificationValeur() {
125
				// rien à faire ici non plus
126
			}
127
 
2606 aurelien 128
			@Override
129
			protected String preTraiterUrlRequete(String urlRequete, String valeur) {
130
				return urlRequete.replace("{utilisateur}", Utilisateur.getInstance().getIdentifiantUtilisateurConsulte());
131
			}
132
 
2602 aurelien 133
		};
134
 
135
		nChamp.addStyleName("panneauEnLigne");
1940 aurelien 136
		add(nChamp);
137
 
2392 aurelien 138
		descriptionChamp = new HTML();
139
		descriptionChamp.addStyleName("aideWikiChampEtendu");
140
		add(descriptionChamp);
141
 
1967 aurelien 142
		ajouterChampsEtenduEtFermer = new Button("Ajouter et fermer");
143
		ajouterChampsEtenduEtFermer.setTooltip("Ajouter un champ étendu ou un groupe de champs et fermer la fenêtre");
1940 aurelien 144
		ajouterChampsEtendu = new Button("Ajouter");
1967 aurelien 145
		ajouterChampsEtendu.setTooltip("Ajouter un champ étendu ou un groupe de champ");
1940 aurelien 146
		annulerAjouterChampEtendu = new Button("Annuler");
1945 aurelien 147
		annulerAjouterChampEtendu.setTooltip("Fermer la fenêtre sans ajouter de champ");
1940 aurelien 148
 
1945 aurelien 149
		hp.add(ajouterChampsEtenduEtFermer);
1940 aurelien 150
		hp.add(ajouterChampsEtendu);
151
		hp.add(annulerAjouterChampEtendu);
152
		add(hp);
2603 aurelien 153
 
1940 aurelien 154
		ajouterListeners();
155
	}
156
 
157
	private void ajouterListeners() {
2602 aurelien 158
 
159
	    listeGroupeChampsEtendus.addChangeHandler(new ChangeHandler() {
1940 aurelien 160
			@Override
2602 aurelien 161
			public void onChange(ChangeEvent event) {
162
				groupeSelectionne = listeGroupeChampsEtendus.getValue(listeGroupeChampsEtendus.getSelectedIndex());
1940 aurelien 163
			}
2602 aurelien 164
		});
1940 aurelien 165
 
1945 aurelien 166
	    ajouterChampsEtenduEtFermer.addListener(new ButtonListenerAdapter() {
167
			@Override
168
			public void onClick(Button button, EventObject e) {
1967 aurelien 169
				if(doitAjouterGroupe()) {
2602 aurelien 170
					surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne));
1945 aurelien 171
				} else {
1967 aurelien 172
					if(champEtenduEstValide()) {
173
						surValidation(validerEtRenvoyerChampEtendu());
174
					} else {
175
						Window.alert("Le nom du champ étendu ne peut pas être vide");
176
					}
177
				}
1945 aurelien 178
			}
179
		});
180
 
1940 aurelien 181
	    ajouterChampsEtendu.addListener(new ButtonListenerAdapter() {
182
			@Override
183
			public void onClick(Button button, EventObject e) {
1945 aurelien 184
				if(champEtenduEstValide()) {
185
					surAjout(validerEtRenvoyerChampEtendu());
186
					raz();
187
				} else {
188
					Window.alert("Le nom du champ étendu ne peut pas être vide");
189
				}
1940 aurelien 190
			}
191
		});
192
 
193
	    annulerAjouterChampEtendu.addListener(new ButtonListenerAdapter() {
194
			@Override
195
			public void onClick(Button button, EventObject e) {
196
				surAnnulation();
197
			}
198
		});
199
	}
200
 
2603 aurelien 201
	public void redimensionner(int largeur) {
202
		nChamp.redimensionner(largeur);
203
	}
204
 
1945 aurelien 205
	private void raz() {
206
		idChamp = null;
2602 aurelien 207
		nChamp.reset();
1945 aurelien 208
		nChamp.focus();
209
	}
210
 
2392 aurelien 211
	private ChampSaisieEtendu validerEtRenvoyerChampEtendu() {
2602 aurelien 212
		String labelChamp = nChamp.getRawValue();
213
		String cleChamp = cacheLabelsCle.containsKey(labelChamp) ? cacheLabelsCle.get(labelChamp) : labelChamp;
214
		ChampSaisieEtendu retour = new ChampSaisieEtendu(labelChamp, cleChamp, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cleChamp));
215
		retour.setId(cleChamp);
1945 aurelien 216
		return retour;
1940 aurelien 217
	}
218
 
1967 aurelien 219
	private List<ChampSaisieEtendu> renvoyerListeChampsEtendus(String groupe) {
220
		List<ChampSaisieEtendu> champsDuGroupe = new ArrayList<ChampSaisieEtendu>();
2033 aurelien 221
		HashMap<String, String> listeChampsEtendus = cacheGroupes.get(groupe);
1967 aurelien 222
		for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator.hasNext();) {
223
			String cle = iterator.next();
224
			String label = listeChampsEtendus.get(cle);
2602 aurelien 225
			ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle,  ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cle));
1967 aurelien 226
			champsDuGroupe.add(champ);
227
		}
228
 
229
		return champsDuGroupe;
230
	}
231
 
232
	private boolean doitAjouterGroupe() {
2602 aurelien 233
		return groupeSelectionne != null && !groupeSelectionne.equals("");
1967 aurelien 234
	}
235
 
1945 aurelien 236
	private boolean champEtenduEstValide() {
2392 aurelien 237
		String valeurChamp = nChamp.getRawValue();
1945 aurelien 238
		return (valeurChamp != null && !valeurChamp.isEmpty());
239
	}
240
 
241
	public abstract void surAjout(ChampSaisieEtendu champ);
1967 aurelien 242
	public abstract void surAjoutMultiple(List<ChampSaisieEtendu> champs);
1940 aurelien 243
	public abstract void surValidation(ChampSaisieEtendu champ);
1967 aurelien 244
	public abstract void surValidationMultiple(List<ChampSaisieEtendu> champs);
1940 aurelien 245
	public abstract void surAnnulation();
246
 
2602 aurelien 247
	public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
2033 aurelien 248
		if(nouvelleDonnees instanceof ListeGroupesChampsEtendus) {
249
			cacheGroupes  = (ListeGroupesChampsEtendus)nouvelleDonnees;
2602 aurelien 250
			listeGroupeChampsEtendus.addItem("...");
251
			for (Iterator<String> iterator = cacheGroupes.keySet().iterator(); iterator.hasNext();) {
252
				listeGroupeChampsEtendus.addItem(iterator.next());
253
			}
254
 
2033 aurelien 255
			if(cacheGroupes.size() > 0) {
256
				conteneurGroupesChampsEtendus.add(indicationSaisieGroupe);
2602 aurelien 257
				conteneurGroupesChampsEtendus.add(conteneurlabelGroupe);
2033 aurelien 258
				doLayout();
259
			}
260
		}
1940 aurelien 261
	}
1967 aurelien 262
 
2392 aurelien 263
 
264
    private void telechargerEtAfficherDescriptionChamps(final String cle) {
265
		ListeReferentielChampsEtendusDAO.telechargerDescriptionWikini(cle, new Callback<String, String>() {
266
			@Override
267
			public void onSuccess(String description) {
268
				afficherDescriptionEtLienWikiChampEtendu(cle, description);
269
			}
270
 
271
			@Override
272
			public void onFailure(String reason) {
273
				// rien
274
			}
275
		});
276
	}
277
 
278
    private void afficherDescriptionEtLienWikiChampEtendu(final String cle, String description) {
279
    	if(description.trim().isEmpty()) {
280
			String urlDesc = ListeReferentielChampsEtendusDAO.obtenirUrlEditionDescriptionWiki(cle);
281
			descriptionChamp.setHTML("<span> Aucune description n'existe pour ce champ.<br />" +
282
					"Vous pouvez la remplir sur cette page :" +
283
					"<a id=\"lien_description_wiki_ce_"+cle+"\" href="+urlDesc+" target=\"_blank\">"+cle+"</span></span>");
284
			Ext.get("lien_description_wiki_ce_"+cle).addListener("click", new EventCallback() {
285
				@Override
286
				public void execute(EventObject e) {
287
					ListeReferentielChampsEtendusDAO.creerPageWikini(cle);
288
				}
289
			});
290
		} else {
291
			descriptionChamp.setHTML("<span class=\"descriptionChampEtenduTitre\">Description :</span> "+description);
292
		}
293
    }
1940 aurelien 294
}