Dans mon application, j'ai un super utilisateur qui peut gérer l'ensemble du logiciel. Lorsque l'utilisateur connecté est l'administrateur, il peut voir quelques boutons pour le faire (gérer). Le problème est avec l'un de ce bouton, le bouton d'administration, que lorsqu'il est tiré, il doit montrer un div caché et charger à l'intérieur de lui quelques boutons. Quand je clique sur le bouton "administration" il charge seulement le div et si je le clique de nouveau il charge le reste du code (les boutons) et obtient le blocage.Gwt bouton besoin d'un double clic pour charger toutes les données dans un div
Je pense que le DOM.getElementById("center_top").getStyle().setDisplay(Display.BLOCK);
bloque le reste du code et j'ai besoin d'un autre clic pour charger les boutons.
Voici le code de la méthode:
package com.unibo.questionandanswer.client.view;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.unibo.questionandanswer.client.CategoriesInterface;
import com.unibo.questionandanswer.client.QuestionAndAnswer;
import com.unibo.questionandanswer.client.UsersService;
import com.unibo.questionandanswer.client.UsersServiceAsync;
import com.unibo.questionandanswer.shared.User;
import com.unibo.questionandanswer.shared.UserRights;
/**
*
* @author Dario
*
*/
public class AdminController {
UserRights rightsFilter = UserRights.USER;
private final UsersServiceAsync usersService = GWT
.create(UsersService.class);
private QuestionAndAnswer controller;
public AdminController(CategoriesInterface categorie) {
if (categorie instanceof QuestionAndAnswer) {
this.controller = (QuestionAndAnswer) categorie.getController();
}
amministraSito();
}
@SuppressWarnings("deprecation")
private void amministraSito() {
// Bottone per l'admin gestione software
final Button amministra = new Button("Amministra");
final Button sitoNormale = new Button("Q&A Sito");
RootPanel.get("top_header").add(amministra);
RootPanel.get("top_header").add(sitoNormale);
DOM.setElementAttribute(amministra.getElement(), "id",
"amministraButton");
DOM.setElementAttribute(sitoNormale.getElement(), "id",
"backSitoButton");
/**
* Esce dalla modalità amministra
*/
sitoNormale.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
controller.setSelectedImpostaCat(false);
amministra.setEnabled(true);
sitoNormale.setEnabled(false);
Window.Location.reload();
}
});
/**
* Entra in modalità amministra
*/
amministra.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// RootPanel.get("center").clear();
// DOM.getElementById("center_top").getStyle().setDisplay(Display.BLOCK);
Document.get().getElementById("center_top").getStyle()
.setDisplay(Display.BLOCK);
RootPanel.get("center_top").clear();
// Util per promuovere giudici o rimuoverli
giudiceUtil();
// Util per rimuovere una risposta
removeAnswerUtil();
// Util per rimuovere una domanda
removeQuestionUtil();
// Util per modificare le categorie
mangeTreeUtil();
amministra.setEnabled(false);
sitoNormale.setEnabled(true);
}
});
}
/**
* Metodo che permette all'admin di modificare le categorie
*/
private void mangeTreeUtil() {
// Bottone per l'admin gestione software
final Button manageTree = new Button("Imposta categorie");
RootPanel.get("center_top").add(manageTree);
manageTree.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
RootPanel.get("center").clear();
controller.setSelectedImpostaCat(true);
controller.buildAdminTree();
}
});
}
/**
* Metodo che permette all'admin di rimuovere una domanda
*/
private void removeQuestionUtil() {
}
/**
* Metodo che permette all'admin di rimuovere una risposta
*/
private void removeAnswerUtil() {
}
/**
* Metodo che permette all'admi di selezionare un giudice o rimuoverlo
*/
private void giudiceUtil() {
// Bottone per inviare dati login al server-side
final Button showUsers = new Button("All Users");
RootPanel.get("center_top").add(showUsers);
showUsers.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
controller.setSelectedImpostaCat(false);
showAllRegisterdUsers();
}
});
}
/**
* Metodo che motra tutti gli utenti registrati
*/
private void showAllRegisterdUsers() {
usersService.registeredUsers(new AsyncCallback<List<User>>() {
@Override
public void onFailure(Throwable caught) {
String alert = "Errore in fase di registrazione";
for (StackTraceElement el : caught.getStackTrace())
alert += "\n" + el.toString();
Window.alert(alert);
}
@Override
public void onSuccess(List<User> result) {
RootPanel.get("center").clear();
final Button users = new Button("Users");
final Button giudici = new Button("Giudici");
HorizontalPanel buttonFilter = new HorizontalPanel();
buttonFilter.add(users);
buttonFilter.add(giudici);
RootPanel.get("center").add(buttonFilter);
// Codice HTML che spiega il funzionamento del come fare
HorizontalPanel hp = new HorizontalPanel();
HTML html = new HTML(
"<p style='margin-left: 20px'>Selezionare il nome utente per cambiare i suoi diritti da USER a GIUDICE e viceversa!</p><hr>");
hp.add(html); // adds the widget to the panel
RootPanel.get("center").add(hp);
users.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
rightsFilter = UserRights.USER;
showAllRegisterdUsers();
controller.setSelectedImpostaCat(false);
}
});
giudici.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
rightsFilter = UserRights.GIUDICE;
showAllRegisterdUsers();
controller.setSelectedImpostaCat(false);
}
});
for (User curr : result) {
if (curr.get_userRight().equals(rightsFilter)) {
// Label per il dialog promozione a giudice
final Label textDialogGiud = new Label(
"Promuovere l'utente a Giudice?");
// Label per il dialog declassa a user
final Label textDialogGiudRemove = new Label(
"Declassare l'utente a User?");
// Bottone per promuovere user
final Button promuovi = new Button("Promuovi!");
// Bottone per declassare user
final Button declassa = new Button("Declassa!");
// Bottone per chiudere la dialog
final Button closeWindow = new Button("Chiudi");
// promuovi.getElement().setId("promuoviUser");
closeWindow.getElement().setId("chiudiDialog");
HorizontalPanel lineDialogText = new HorizontalPanel();
HorizontalPanel controllButtonsDialog = new HorizontalPanel();
FlowPanel flowPanelGiudice = new FlowPanel();
// Se l'utente selezionato è giudice carico i pulsanti
// per declassare
if (curr.get_userRight().equals(UserRights.GIUDICE)) {
controllButtonsDialog.add(declassa);
lineDialogText.add(textDialogGiudRemove);
} else if (curr.get_userRight().equals(UserRights.USER)) {
// Se l'utente selezionato è user carico i pulsanti
// per promuovere
controllButtonsDialog.add(promuovi);
lineDialogText.add(textDialogGiud);
}
// lineDialogText.add(textDialogGiud);
// controllButtonsDialog.add(promuovi);
controllButtonsDialog.add(closeWindow);
// Carico gli horizontal panel con i label e button che
// mi servono
// in base allo user
flowPanelGiudice.add(lineDialogText);
flowPanelGiudice.add(controllButtonsDialog);
final DialogBox dialogSelectGiud = new DialogBox();
dialogSelectGiud.setAnimationEnabled(true);
dialogSelectGiud.setWidget(flowPanelGiudice);
final HorizontalPanel userPanel = new HorizontalPanel();
final Label username = new Label(curr.getUsername());
// Handler che gestisce la gestione del click sulla
// lista
// di utenti o giudici
username.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogSelectGiud.setText("Selezionato: "
+ username.getText().toString());
dialogSelectGiud.center();
dialogSelectGiud.show();
}
});
userPanel.add(username);
RootPanel.get("center").add(userPanel);
/*
* BUTTON PROMUOVI UTENTE
*/
promuovi.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogSelectGiud.hide();
usersService.findUser(username.getText()
.toString(), new AsyncCallback<User>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Errore nel trovare lo User!");
}
@Override
public void onSuccess(User result) {
result.set_userRight(UserRights.GIUDICE);
usersService.changeUserRights(result,
new AsyncCallback<Void>() {
@Override
public void onFailure(
Throwable caught) {
Window.alert("Errore nella promozione utente!");
}
@Override
public void onSuccess(
Void result) {
Window.alert("Utente promosso a giudice! "
+ username
.getText()
.toString());
showAllRegisterdUsers();
}
});
}
});
}
});
/*
* BUTTON DECLASSA UTENTE
*/
declassa.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogSelectGiud.hide();
usersService.findUser(username.getText()
.toString(), new AsyncCallback<User>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Errore nel trovare lo User!");
}
@Override
public void onSuccess(User result) {
result.set_userRight(UserRights.USER);
usersService.changeUserRights(result,
new AsyncCallback<Void>() {
@Override
public void onFailure(
Throwable caught) {
Window.alert("Errore nel declassare l'utente!");
}
@Override
public void onSuccess(
Void result) {
Window.alert("Utente declassato a user! "
+ username
.getText()
.toString());
showAllRegisterdUsers();
}
});
}
});
}
});
/*
* BUTTON CHIUDI DIALOG PROMOZIONE
*/
closeWindow.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogSelectGiud.hide();
}
});
/*
* QUALCHE CSS PER BUTTONS
*/
userPanel.getElement().setAttribute("style",
"margin: auto; padding: 10px");
users.getElement().setAttribute("style",
"margin: 5px 0 5px 5px;");
giudici.getElement().setAttribute("style",
"margin: 5px 0 5px 5px; ");
//CSS per bottoni dentro dialogbox
controllButtonsDialog.setWidth("100%");
controllButtonsDialog.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
promuovi.getElement().setAttribute("style",
"margin: 20px 5px 5px 5px; float: left;");
declassa.getElement().setAttribute("style",
"margin: 20px 5px 5px 5px; float: left;");
closeWindow.getElement().setAttribute("style",
"margin: 20px 5px 5px 5px; float: right;");
}
}
}
});
}
}
Et voici le css qui cache la "center_top" div
#center_top{
position: absolute;
top: 0;
width: 100%;
height: 30px;
border-bottom:1px solid black;
display: none;
}
Pourquoi seulement avec ce bouton i besoin d'un double-clic montrer div et charger les boutons à l'intérieur?
Le DOM.getElementById bloque l'exécution du code?
La console du navigateur unrlined cette ligne de code
/**
* Adds a widget to the detach list. This is the list of widgets to be
* detached when the page unloads.
*
* <p>
* This method must be called for all widgets that have no parent widgets.
* These are most commonly {@link RootPanel RootPanels}, but can also be any
* widget used to wrap an existing element on the page. Failing to do this may
* cause these widgets to leak memory. This method is called automatically by
* widgets' wrap methods (e.g.
* {@link Button#wrap(com.google.gwt.dom.client.Element)}).
* </p>
*
* <p>
* This method may <em>not</em> be called on any widget whose element is
* contained in another widget. This is to ensure that the DOM and Widget
* hierarchies cannot get into an inconsistent state.
* </p>
*
* @param widget the widget to be cleaned up when the page closes
* @see #detachNow(Widget)
*/
public static void detachOnWindowClose(Widget widget) {
assert !widgetsToDetach.contains(widget) : "detachOnUnload() called twice "
+ "for the same widget";
assert !isElementChildOfWidget(widget.getElement()) : "A widget that has "
+ "an existing parent widget may not be added to the detach list";
widgetsToDetach.add(widget);
}
Si vous pouvez cliquer sur le bouton la deuxième fois, cela signifie qu'il est toujours activé. Donc votre code n'atteint pas la ligne 'amministra.setEnabled (false); Vous devriez vérifier la console d'erreur dans votre navigateur. – Adam
ajouté l'erreur de la console du navigateur, pouvez-vous m'aider à le comprendre? – Dario