Hi,
I am creating add-on which create custom forms and user can fill fields from it e.g questionnaire. I have done almost everything else but I have problem to get data from UI to server side. I have tried to use rpc or state but always no correct result. What is the best practice? I am using Vaadin 7.
This questionnaire will always contain one submit button. After submit button click will questionnaire add-on contain user answers for further handling. Button click handling works fine.
I attach here small part from application where add-on is used so you can figure my idea better. I also attach my current situation from server and client codes. Those doesn’t work either.
// Application
final Questionnaire questionnaire = new Questionnaire("Testing addon");
questionnaire.setDescription("This is questionnaire testing.");
Question q1 = new Question("Your name"); // Textfield is default
List<Question> questionSet = new ArrayList<Question>();
questionSet.add(q1);
Question q2 = new Question("Interestings", QuestionType.CHECKBOX);
q2.addAnswer("Sports");
q2.addAnswer("Music");
q2.addAnswer("Movies");
q2.addAnswer("Books");
questionSet.add(q2);
// Here we set questions
questionnaire.setQuestionSet(questionSet);
questionnaire.addClickListener(new SubmitButtonClickListener() {
@Override
public void buttonClick(SubmitButtonClickEvent event) {
// This is part where I can't get any data
final List<Answer> answers = questionnaire.getUserAnswers();
if (answers != null) {
// iterate thru and populate answers.
} else {
// Show no data text
}
}
});
// Server side
public class Questionnaire extends com.vaadin.ui.AbstractComponent {
...
public void setQuestionSet(List<Question> questionSet) {
this.getState().setQuestionSet(questionSet);
this.getState().setAnswersAvailable(false);
markAsDirty();
}
public List<Answer> getUserAnswers() {
return getState().getUserAnswers();
}
...
}
@Connect(Questionnaire.class)
public class QuestionnaireConnector extends AbstractComponentConnector {
QuestionnaireServerRpc serverRpc = RpcProxy.create(
QuestionnaireServerRpc.class, this);
public QuestionnaireConnector() {
getWidget().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
final MouseEventDetails mouseDetails = MouseEventDetailsBuilder
.buildMouseEventDetails(event.getNativeEvent(),
getWidget().getElement());
// This will cause event fire
serverRpc.submitButtonClicked(mouseDetails);
}
});
}
@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);
if (getState().isAnswersAvailable() == false) {
getWidget().setQuestions(getState().getQuestionSet());
} else {
getState().setUserAnswers(getWidget().getUserAnswers());
}
}
...
}
// Client side
public class QuestionnaireWidget extends VerticalPanel {
...
public void addClickHandler(ClickHandler clickHandler) {
this.submitButton.addClickHandler(clickHandler);
}
public List<Answer> getUserAnswers() {
List<Answer> answers = new ArrayList<Answer>();
for (QuestionControl qc : this.questionControls) {
Answer answer = new Answer();
answer.setQuestionId(qc.getId());
answer.setValue(qc.getUserAnswer());
answers.add(answer);
}
return answers;
}
...
}