Moved more stuff to BaseCRUDController.
* New methods: * saveAndExit * saveAndContinue * cancelForm * confirmDelete * doAfterCompose now sets "controller" variable. FEA: ItEr75S13GenericCRUDController
This commit is contained in:
parent
d0e1d0e91b
commit
d8dc2d58d6
3 changed files with 126 additions and 103 deletions
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 & 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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue