Moved more stuff to BaseCRUDController.

* New methods:
  * saveAndExit
  * saveAndContinue
  * cancelForm
  * confirmDelete
* doAfterCompose now sets "controller" variable.

FEA: ItEr75S13GenericCRUDController
This commit is contained in:
Manuel Rego Casasnovas 2011-07-06 11:22:05 +02:00
parent d0e1d0e91b
commit d8dc2d58d6
3 changed files with 126 additions and 103 deletions

View file

@ -22,8 +22,10 @@ package org.navalplanner.web.common;
import static org.navalplanner.web.I18nHelper._;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.common.exceptions.ValidationException;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.api.Window;
/**
@ -31,10 +33,11 @@ import org.zkoss.zul.api.Window;
*
* Those screens must define the following components:
* <ul>
* <li>{@link Component} messagesContainer: A container to show the different
* <li>{@link #messagesContainer}: A {@link Component} to show the different
* messages to users.</li>
* <li>{@link Window} listWindow: A window where the list of elements is shown.</li>
* <li>{@link Window} editWindow: A window with creation/edition form.</li>
* <li>{@link #listWindow}: A {@link Window} where the list of elements is
* shown.</li>
* <li>{@link #editWindow}: A {@link Window} with creation/edition form.</li>
*
* @author Manuel Rego Casasnovas <rego@igalia.com>
*/
@ -58,9 +61,21 @@ public abstract class BaseCRUDController<T extends BaseEntity> extends
private CRUCControllerState state = CRUCControllerState.LIST;
/**
* Call to super and do some extra stuff: <br />
* <ul>
* <li>Set "controller" variable to be used in .zul files.</li>
* <li>Initialize {@link #messagesForUser}.</li>
* <li>Show list view.</li>
* </ul>
*
* @see org.zkoss.zk.ui.util.GenericForwardComposer#doAfterCompose(org.zkoss.zk.ui.Component)
*/
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setAttribute("controller", this);
messagesForUser = new MessagesForUser(messagesContainer);
listWindow.setTitle(_("{0} List", getPluralEntityType()));
@ -158,4 +173,93 @@ public abstract class BaseCRUDController<T extends BaseEntity> extends
*/
protected abstract void initEdit(T entity);
/**
* Save current form and go to list view. Delegate in {@link #save()} that
* should be implemented in subclasses.
*/
public void saveAndExit() {
try {
save();
messagesForUser.showMessage(Level.INFO,
_("{0} saved", getEntityType()));
goToList();
} catch (ValidationException e) {
messagesForUser.showInvalidValues(e);
}
}
/**
* Save current form and continue in edition view. Delegate in
* {@link #save()} that should be implemented in subclasses.
*/
public void saveAndContinue() {
try {
save();
messagesForUser.showMessage(Level.INFO,
_("{0} saved", getEntityType()));
goToEditForm(getEntityBeingEdited());
} catch (ValidationException e) {
messagesForUser.showInvalidValues(e);
}
}
/**
* Performs actions to save current form
*
* @throws ValidationException
* If entity is not valid
*/
protected abstract void save() throws ValidationException;
/**
* Returns entity being edited in the form
*
* @return Current entity being edited
*/
protected abstract T getEntityBeingEdited();
/**
* Close form and go to list view. Delegate in {@link #cancel()} that should
* be implemented in subclasses.
*/
public void cancelForm() {
cancel();
goToList();
}
/**
* Performs needed actions to cancel edition
*/
protected abstract void cancel();
/**
* Shows a dialog asking for confirmation to user and if ok remove entity
* passed as parameter. Delegate in {@link #delete(entity)} that should be
* implemented in subclasses.
*
* @param entity
* Entity to be removed
*/
public void confirmDelete(T entity) {
try {
if (Messagebox.show(
_("Delete {0}. Are you sure?", getEntityType()),
_("Confirm"), Messagebox.OK | Messagebox.CANCEL,
Messagebox.QUESTION) == Messagebox.OK) {
delete(entity);
Util.reloadBindings(listWindow);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
/**
* Performs actions needed to remove entity passed as parameter
*
* @param entity
* Entity to be removed
*/
protected abstract void delete(T entity);
}

View file

@ -32,9 +32,7 @@ import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.labels.entities.LabelType;
import org.navalplanner.web.common.BaseCRUDController;
import org.navalplanner.web.common.IMessagesForUser;
import org.navalplanner.web.common.Level;
import org.navalplanner.web.common.MessagesForUser;
import org.navalplanner.web.common.Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.zkoss.zk.ui.Component;
@ -49,7 +47,6 @@ import org.zkoss.zul.Constraint;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.ListModelExt;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.api.Rows;
@ -63,8 +60,6 @@ public class LabelTypeCRUDController extends BaseCRUDController<LabelType> {
@Autowired
private ILabelTypeModel labelTypeModel;
private IMessagesForUser messagesEditWindow;
private Grid gridLabelTypes;
private Grid gridLabels;
@ -78,9 +73,6 @@ public class LabelTypeCRUDController extends BaseCRUDController<LabelType> {
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setVariable("controller", this, true);
messagesEditWindow = new MessagesForUser(editWindow
.getFellowIfAny("messagesContainer"));
initializeLabelsGrid();
initializeLabelTypesGrid();
newLabelTextbox = (Textbox) editWindow
@ -185,18 +177,10 @@ public class LabelTypeCRUDController extends BaseCRUDController<LabelType> {
return labelTypeModel.getLabels();
}
/**
* Save current {@link LabelType} and return
*/
@Override
public void save() {
validate();
try {
labelTypeModel.confirmSave();
goToList();
messagesForUser.showMessage(Level.INFO, _("Label type saved"));
} catch (ValidationException e) {
showInvalidValues(e);
}
labelTypeModel.confirmSave();
}
/**
@ -235,65 +219,6 @@ public class LabelTypeCRUDController extends BaseCRUDController<LabelType> {
}
}
/**
* Save current {@link LabelType} and continue
*/
public void saveAndContinue() {
validate();
try {
labelTypeModel.confirmSave();
goToEditForm(labelTypeModel.getLabelType());
messagesEditWindow.showMessage(Level.INFO, _("Label saved"));
} catch (ValidationException e) {
showInvalidValues(e);
}
}
private void showInvalidValues(ValidationException e) {
for (InvalidValue invalidValue : e.getInvalidValues()) {
Object value = invalidValue.getBean();
if (value instanceof LabelType) {
validateLabelType(invalidValue);
}
if (value instanceof Label) {
validateLabel(invalidValue);
}
}
}
private void validateLabelType(InvalidValue invalidValue) {
Component component = editWindow.getFellowIfAny("label_type_"
+ invalidValue.getPropertyName());
if (component != null) {
throw new WrongValueException(component, invalidValue.getMessage());
}
}
@SuppressWarnings("unchecked")
private void validateLabel(InvalidValue invalidValue) {
Row listitem = findLabel(gridLabels.getRows().getChildren(),
(Label) invalidValue.getBean());
if (listitem != null) {
throw new WrongValueException(listitem, invalidValue.getMessage());
}
}
private Row findLabel(List<Row> rows, Label label) {
for (Row row : rows) {
if (label.equals(row.getValue())) {
return row;
}
}
return null;
}
/**
* Cancel edition
*/
public void close() {
goToList();
}
public void createLabel() {
try{
validateNewLabel();
@ -354,27 +279,6 @@ public class LabelTypeCRUDController extends BaseCRUDController<LabelType> {
Util.reloadBindings(gridLabels);
}
/**
* Pop up confirm remove dialog
* @param labelType
*/
public void confirmDelete(LabelType labelType) {
try {
if (Messagebox.show(_("Delete item. Are you sure?"), _("Confirm"),
Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION) == Messagebox.OK) {
labelTypeModel.confirmDelete(labelType);
Grid labelTypes = (Grid) listWindow
.getFellowIfAny("labelTypes");
if (labelTypes != null) {
Util.reloadBindings(labelTypes);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onCheckGenerateCode(Event e) {
CheckEvent ce = (CheckEvent) e;
if (ce.isChecked()) {
@ -407,4 +311,19 @@ public class LabelTypeCRUDController extends BaseCRUDController<LabelType> {
labelTypeModel.initEdit(labelType);
}
@Override
protected LabelType getEntityBeingEdited() {
return labelTypeModel.getLabelType();
}
@Override
protected void cancel() {
// Do nothing
}
@Override
protected void delete(LabelType labelType) {
labelTypeModel.confirmDelete(labelType);
}
}

View file

@ -104,13 +104,13 @@
<!-- Control buttons -->
<hbox>
<button label="${i18n:_('Save')}"
onClick="controller.save()"
onClick="controller.saveAndExit()"
sclass="save-button global-action"/>
<button label="${i18n:_('Save &amp; Continue')}"
onClick="controller.saveAndContinue()"
sclass="saveandcontinue-button global-action"/>
<button label="${i18n:_('Cancel')}"
onClick="controller.close()"
onClick="controller.cancelForm()"
sclass="cancel-button global-action"/>
</hbox>
</window>