Administration pages for unit types for materials. Listing, creation, edition and remove of unit types.
This commit is contained in:
parent
c6b490df65
commit
a798653c57
10 changed files with 689 additions and 5 deletions
|
|
@ -28,6 +28,7 @@ import org.navalplanner.business.materials.entities.UnitType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||||
|
* @author Javier Moran Rua <jmoran@igalia.com>
|
||||||
*/
|
*/
|
||||||
public interface IUnitTypeDAO extends IIntegrationEntityDAO<UnitType> {
|
public interface IUnitTypeDAO extends IIntegrationEntityDAO<UnitType> {
|
||||||
|
|
||||||
|
|
@ -39,4 +40,9 @@ public interface IUnitTypeDAO extends IIntegrationEntityDAO<UnitType> {
|
||||||
throws InstanceNotFoundException;
|
throws InstanceNotFoundException;
|
||||||
|
|
||||||
boolean existsUnitTypeByNameInAnotherTransaction(String measure);
|
boolean existsUnitTypeByNameInAnotherTransaction(String measure);
|
||||||
|
|
||||||
|
UnitType findByNameCaseInsensitive(String measure)
|
||||||
|
throws InstanceNotFoundException;
|
||||||
|
|
||||||
|
boolean isUnitTypeUsedInAnyMaterial(UnitType unitType);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,12 @@ package org.navalplanner.business.materials.daos;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.hibernate.Criteria;
|
||||||
|
import org.hibernate.criterion.MatchMode;
|
||||||
import org.hibernate.criterion.Restrictions;
|
import org.hibernate.criterion.Restrictions;
|
||||||
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
|
import org.navalplanner.business.common.daos.IntegrationEntityDAO;
|
||||||
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
|
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
|
||||||
|
import org.navalplanner.business.materials.entities.Material;
|
||||||
import org.navalplanner.business.materials.entities.UnitType;
|
import org.navalplanner.business.materials.entities.UnitType;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
|
|
@ -36,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
/**
|
/**
|
||||||
* DAO for {@link UnitType}
|
* DAO for {@link UnitType}
|
||||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||||
|
* @author Javier Moran Rua <jmoran@igaia.com>
|
||||||
*/
|
*/
|
||||||
@Repository
|
@Repository
|
||||||
@Scope(BeanDefinition.SCOPE_SINGLETON)
|
@Scope(BeanDefinition.SCOPE_SINGLETON)
|
||||||
|
|
@ -70,18 +74,41 @@ public class UnitTypeDAO extends IntegrationEntityDAO<UnitType> implements
|
||||||
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
|
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
|
||||||
public UnitType findUniqueByNameInAnotherTransaction(String measure)
|
public UnitType findUniqueByNameInAnotherTransaction(String measure)
|
||||||
throws InstanceNotFoundException {
|
throws InstanceNotFoundException {
|
||||||
return findByName(measure);
|
return findByNameCaseInsensitive(measure);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
|
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
|
||||||
public boolean existsUnitTypeByNameInAnotherTransaction(String measure) {
|
public boolean existsUnitTypeByNameInAnotherTransaction(String measure) {
|
||||||
try {
|
try {
|
||||||
findByName(measure);
|
findByNameCaseInsensitive(measure);
|
||||||
} catch (InstanceNotFoundException e) {
|
} catch (InstanceNotFoundException e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public UnitType findByNameCaseInsensitive(String measure)
|
||||||
|
throws InstanceNotFoundException {
|
||||||
|
Criteria c = getSession().createCriteria(UnitType.class);
|
||||||
|
c.add(Restrictions.ilike("measure", measure, MatchMode.EXACT));
|
||||||
|
UnitType result = (UnitType) c.uniqueResult();
|
||||||
|
|
||||||
|
if (result == null) {
|
||||||
|
throw new InstanceNotFoundException(measure,
|
||||||
|
getEntityClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public boolean isUnitTypeUsedInAnyMaterial(UnitType unitType) {
|
||||||
|
Criteria c = getSession().createCriteria(Material.class);
|
||||||
|
return !c.add(Restrictions.eq("unitType", unitType)).list().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,16 +32,26 @@ import org.navalplanner.business.materials.daos.IUnitTypeDAO;
|
||||||
* UnitType entity
|
* UnitType entity
|
||||||
*
|
*
|
||||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||||
*
|
* @author Javier Moran Rua <jmoran@ialia.com>
|
||||||
*/
|
*/
|
||||||
public class UnitType extends IntegrationEntity{
|
public class UnitType extends IntegrationEntity{
|
||||||
|
|
||||||
public static UnitType create(String code, String measure) {
|
public static UnitType create(String code, String measure) {
|
||||||
return (UnitType) create(new UnitType(measure), code);
|
UnitType unitType = new UnitType(measure);
|
||||||
|
unitType.setNewObject(true);
|
||||||
|
return (UnitType) create(unitType, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UnitType create(String measure) {
|
public static UnitType create(String measure) {
|
||||||
return (UnitType) create(new UnitType(measure));
|
UnitType unitType = new UnitType(measure);
|
||||||
|
unitType.setNewObject(true);
|
||||||
|
return (UnitType) create(unitType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UnitType create() {
|
||||||
|
UnitType unitType = new UnitType();
|
||||||
|
unitType.setNewObject(true);
|
||||||
|
return create(unitType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateUnvalidated(String measure) {
|
public void updateUnvalidated(String measure) {
|
||||||
|
|
|
||||||
|
|
@ -222,6 +222,7 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
|
||||||
subItem(_("Calendars"),"/calendars/calendars.zul", "03-calendarios.html"),
|
subItem(_("Calendars"),"/calendars/calendars.zul", "03-calendarios.html"),
|
||||||
subItem(_("Label types"), "/labels/labelTypes.zul","10-etiquetas.html"),
|
subItem(_("Label types"), "/labels/labelTypes.zul","10-etiquetas.html"),
|
||||||
subItem(_("Materials"), "/materials/materials.zul", "11-materiales.html#administraci-n-de-materiais"),
|
subItem(_("Materials"), "/materials/materials.zul", "11-materiales.html#administraci-n-de-materiais"),
|
||||||
|
subItem(_("Unit types"), "/materials/unitTypes.zul", "11-materiales.html#administraci-n-de-materiais"),
|
||||||
subItem(_("Manage cost categories"),"/costcategories/costCategory.zul","14-custos.html#categor-as-de-custo"),
|
subItem(_("Manage cost categories"),"/costcategories/costCategory.zul","14-custos.html#categor-as-de-custo"),
|
||||||
subItem(_("Manage types of work hours"),"/costcategories/typeOfWorkHours.zul","14-custos.html#administraci-n-de-horas-traballadas"),
|
subItem(_("Manage types of work hours"),"/costcategories/typeOfWorkHours.zul","14-custos.html#administraci-n-de-horas-traballadas"),
|
||||||
subItem(_("Configuration"), "/common/configuration.zul","03-calendarios.html#calendario-por-defecto"),
|
subItem(_("Configuration"), "/common/configuration.zul","03-calendarios.html#calendario-por-defecto"),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
package org.navalplanner.web.materials;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.navalplanner.business.common.exceptions.ValidationException;
|
||||||
|
import org.navalplanner.business.materials.entities.UnitType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for the model which lets the client of this model
|
||||||
|
* list the unit types, create new unit types, edit existing unit types
|
||||||
|
* and remove unity types
|
||||||
|
*
|
||||||
|
* <strong>Conversation state:</strong> A unit type being edited or created.
|
||||||
|
*
|
||||||
|
* <strong>Not conversational methods:</strong>
|
||||||
|
* <ul>
|
||||||
|
* <li>getUnitTypes</li>
|
||||||
|
* <li>existsAnotherUnitTypeWithName</li>
|
||||||
|
* <li>existsAnotherUnitTypeWithCode</li>
|
||||||
|
* <li>isUnitTypeUsedInAnyMaterial</li>
|
||||||
|
* <li>isUnitTypeUsedInAnyMaterial</li>
|
||||||
|
* <li>remove</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <strong>Conversational methods:</strong>
|
||||||
|
* <ul>
|
||||||
|
* <li>initCreate</li>
|
||||||
|
* <li>initEdit</li>
|
||||||
|
* <li>getCurrentUnitType</li>
|
||||||
|
* <li>confirmSave</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @author Javier Moran Rua <jmoran@igalia.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface IUnitTypeModel {
|
||||||
|
|
||||||
|
// Non conversational methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the database to get all the unit types in the database
|
||||||
|
*/
|
||||||
|
List<UnitType> getUnitTypes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method check if there is another UnitType in the database
|
||||||
|
* different from the one in the state of the model which had the same
|
||||||
|
* measure name as the parameter.
|
||||||
|
*
|
||||||
|
* @param name the measure name to be checked as unique in the unit types
|
||||||
|
* @return the boolean with the result
|
||||||
|
*/
|
||||||
|
boolean existsAnotherUnitTypeWithName(String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method check if there is another UnitType in the database
|
||||||
|
* different from the one in the state of the model which had teh same
|
||||||
|
* code as the parameter
|
||||||
|
*
|
||||||
|
* @param code the code to be checked as unique
|
||||||
|
* @return the boolean showing the result
|
||||||
|
*/
|
||||||
|
boolean existsAnotherUnitTypeWithCode(String code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method finds out if the unit type passed as parameter is
|
||||||
|
* used to measure any material
|
||||||
|
*
|
||||||
|
* @param unitType the unitType to check
|
||||||
|
* @return the boolean with the result
|
||||||
|
*/
|
||||||
|
boolean isUnitTypeUsedInAnyMaterial(UnitType unitType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method removes the unit type passed as parameter from the
|
||||||
|
* database
|
||||||
|
*
|
||||||
|
* @param unitType the unitType which is wanted to be deleted
|
||||||
|
*/
|
||||||
|
void remove(UnitType unitType);
|
||||||
|
|
||||||
|
//Conversational methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First method of the conversational state. Prepares the state with the
|
||||||
|
* unit type to edit
|
||||||
|
*/
|
||||||
|
void initEdit(UnitType unitType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First method of the conversational state. Creates an empty unit type
|
||||||
|
* to be saved
|
||||||
|
*/
|
||||||
|
void initCreate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current unit type which is in the state of the
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
UnitType getCurrentUnitType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last method of the conversation. It ends with the saving of the unit
|
||||||
|
* type in the state to the database
|
||||||
|
*
|
||||||
|
* @throws ValidationException
|
||||||
|
*/
|
||||||
|
void confirmSave() throws ValidationException;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,249 @@
|
||||||
|
package org.navalplanner.web.materials;
|
||||||
|
|
||||||
|
import static org.navalplanner.web.I18nHelper._;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.navalplanner.business.common.exceptions.ValidationException;
|
||||||
|
import org.navalplanner.business.materials.entities.UnitType;
|
||||||
|
import org.navalplanner.web.common.IMessagesForUser;
|
||||||
|
import org.navalplanner.web.common.Level;
|
||||||
|
import org.navalplanner.web.common.MessagesForUser;
|
||||||
|
import org.navalplanner.web.common.OnlyOneVisible;
|
||||||
|
import org.navalplanner.web.common.Util;
|
||||||
|
import org.zkoss.util.logging.Log;
|
||||||
|
import org.zkoss.zk.ui.Component;
|
||||||
|
import org.zkoss.zk.ui.WrongValueException;
|
||||||
|
import org.zkoss.zk.ui.event.Event;
|
||||||
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
import org.zkoss.zk.ui.util.GenericForwardComposer;
|
||||||
|
import org.zkoss.zul.Constraint;
|
||||||
|
import org.zkoss.zul.Hbox;
|
||||||
|
import org.zkoss.zul.Label;
|
||||||
|
import org.zkoss.zul.Messagebox;
|
||||||
|
import org.zkoss.zul.Row;
|
||||||
|
import org.zkoss.zul.RowRenderer;
|
||||||
|
import org.zkoss.zul.Textbox;
|
||||||
|
import org.zkoss.zul.impl.InputElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Controller for the listing and editing unit types
|
||||||
|
*
|
||||||
|
* @author Javier Moran Rua <jmoran@igalia.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class UnitTypeController extends GenericForwardComposer {
|
||||||
|
|
||||||
|
private static final org.apache.commons.logging.Log LOG = LogFactory
|
||||||
|
.getLog(UnitTypeController.class);
|
||||||
|
|
||||||
|
private Component messagesContainer;
|
||||||
|
private IMessagesForUser messagesForUser;
|
||||||
|
private OnlyOneVisible visibility;
|
||||||
|
|
||||||
|
private Component listWindow;
|
||||||
|
private Component editWindow;
|
||||||
|
|
||||||
|
private IUnitTypeModel unitTypeModel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doAfterCompose(Component comp) throws Exception {
|
||||||
|
super.doAfterCompose(comp);
|
||||||
|
messagesForUser = new MessagesForUser(messagesContainer);
|
||||||
|
comp.setVariable("controller", this, true);
|
||||||
|
getVisibility().showOnly(listWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
private OnlyOneVisible getVisibility() {
|
||||||
|
if (visibility == null) {
|
||||||
|
visibility = new OnlyOneVisible(listWindow,editWindow);
|
||||||
|
}
|
||||||
|
return visibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<UnitType> getUnitTypes() {
|
||||||
|
return unitTypeModel.getUnitTypes();
|
||||||
|
}
|
||||||
|
|
||||||
|
public RowRenderer getUnitTypeRenderer() {
|
||||||
|
|
||||||
|
return new RowRenderer() {
|
||||||
|
@Override
|
||||||
|
public void render(Row row, Object data) throws Exception {
|
||||||
|
UnitType unitType = (UnitType) data;
|
||||||
|
|
||||||
|
appendUnitTypeName(row, unitType);
|
||||||
|
appendOperations(row, unitType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendUnitTypeName(Row row, UnitType unitType) {
|
||||||
|
row.appendChild(new Label(unitType.getMeasure()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendOperations(Row row, final UnitType unitType) {
|
||||||
|
Hbox hbox = new Hbox();
|
||||||
|
|
||||||
|
hbox.appendChild(Util.createEditButton(new EventListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEvent(Event event) throws Exception {
|
||||||
|
goToEditFormInEditionMode(unitType);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
hbox.appendChild(Util.createRemoveButton(new EventListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEvent(Event event) throws Exception {
|
||||||
|
confirmRemove(unitType);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
row.appendChild(hbox);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void confirmRemove(UnitType unitType) {
|
||||||
|
try {
|
||||||
|
int status = Messagebox.show(_("Confirm deleting {0}. Are you sure?", unitType.getMeasure()),
|
||||||
|
"Delete", Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION);
|
||||||
|
if (Messagebox.OK == status) {
|
||||||
|
removeUnitType(unitType);
|
||||||
|
}
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.error("Error showing confirming message box",e);
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeUnitType(UnitType unitType) {
|
||||||
|
if (unitTypeModel.isUnitTypeUsedInAnyMaterial(unitType)) {
|
||||||
|
messagesForUser.showMessage(Level.ERROR, _("Unit {0} cannot be " +
|
||||||
|
" removed because it is used in materials",
|
||||||
|
unitType.getMeasure()));
|
||||||
|
} else {
|
||||||
|
unitTypeModel.remove(unitType);
|
||||||
|
Util.reloadBindings(listWindow);
|
||||||
|
messagesForUser.showMessage(Level.INFO, _("Deleted unit type {0}",
|
||||||
|
unitType.getMeasure()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goToEditFormInCreationMode() {
|
||||||
|
unitTypeModel.initCreate();
|
||||||
|
getVisibility().showOnly(editWindow);
|
||||||
|
Util.reloadBindings(editWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void goToEditFormInEditionMode(UnitType unitType) {
|
||||||
|
unitTypeModel.initEdit(unitType);
|
||||||
|
getVisibility().showOnly(editWindow);
|
||||||
|
Util.reloadBindings(editWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnitType getUnitType() {
|
||||||
|
return unitTypeModel.getCurrentUnitType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Constraint uniqueMeasureName() {
|
||||||
|
return new Constraint() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validate(Component comp, Object value)
|
||||||
|
throws WrongValueException {
|
||||||
|
String strValue = (String) value;
|
||||||
|
if (StringUtils.isBlank(strValue)) {
|
||||||
|
throw new WrongValueException(comp,
|
||||||
|
_("Unit type name cannot be empty")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unitTypeModel.existsAnotherUnitTypeWithName(strValue)) {
|
||||||
|
throw new WrongValueException(comp,
|
||||||
|
_("The meausure name is not valid. There is " +
|
||||||
|
"another unit type with the same " +
|
||||||
|
"measure name"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Constraint uniqueCode() {
|
||||||
|
return new Constraint() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validate(Component comp, Object value)
|
||||||
|
throws WrongValueException {
|
||||||
|
String strValue = (String) value;
|
||||||
|
if (StringUtils.isBlank(strValue)) {
|
||||||
|
throw new WrongValueException(comp,
|
||||||
|
_("Unit type code cannot be empty"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unitTypeModel.existsAnotherUnitTypeWithCode(strValue)) {
|
||||||
|
throw new WrongValueException(comp,
|
||||||
|
_("The code is not valid. There is another " +
|
||||||
|
"unit type with the same code"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
public void saveAndExit() {
|
||||||
|
if (save()) {
|
||||||
|
goToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveAndContinue() {
|
||||||
|
if (save()) {
|
||||||
|
goToEditFormInEditionMode(getUnitType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
goToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean save() {
|
||||||
|
try {
|
||||||
|
validateAll();
|
||||||
|
unitTypeModel.confirmSave();
|
||||||
|
messagesForUser.showMessage(Level.INFO, _("Unit type saved"));
|
||||||
|
return true;
|
||||||
|
} catch (ValidationException e) {
|
||||||
|
messagesForUser.showInvalidValues(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateAll() {
|
||||||
|
Textbox codeTextBox = (Textbox) editWindow.
|
||||||
|
getFellowIfAny("codeTextBox");
|
||||||
|
validate((InputElement) codeTextBox,codeTextBox.getValue());
|
||||||
|
|
||||||
|
Textbox measureTextBox = (Textbox) editWindow.
|
||||||
|
getFellowIfAny("measureTextBox");
|
||||||
|
validate((InputElement) measureTextBox,measureTextBox.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates {@link Textbox} checking {@link Constraint}
|
||||||
|
* @param comp
|
||||||
|
*/
|
||||||
|
private void validate(InputElement comp, Object value) {
|
||||||
|
if (comp != null && comp.getConstraint() != null) {
|
||||||
|
final Constraint constraint = comp.getConstraint();
|
||||||
|
constraint.validate(comp, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void goToList() {
|
||||||
|
Util.reloadBindings(listWindow);
|
||||||
|
getVisibility().showOnly(listWindow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
package org.navalplanner.web.materials;
|
||||||
|
|
||||||
|
import static org.navalplanner.web.I18nHelper._;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
|
||||||
|
import org.navalplanner.business.common.exceptions.ValidationException;
|
||||||
|
import org.navalplanner.business.materials.daos.IUnitTypeDAO;
|
||||||
|
import org.navalplanner.business.materials.entities.UnitType;
|
||||||
|
import org.navalplanner.web.common.concurrentdetection.OnConcurrentModification;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model for the listing, creation and edition of UnitTypes
|
||||||
|
*
|
||||||
|
* @author Javier Moran Rua <jmoran@igalia.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||||
|
@OnConcurrentModification(goToPage = "/materials/unitTypes.zul")
|
||||||
|
public class UnitTypeModel implements IUnitTypeModel {
|
||||||
|
|
||||||
|
private static final org.apache.commons.logging.Log LOG = LogFactory
|
||||||
|
.getLog(UnitTypeModel.class);
|
||||||
|
|
||||||
|
// This is the state of the model, just the current unitType being edited
|
||||||
|
private UnitType unitTypeState;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IUnitTypeDAO unitTypeDAO;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public List<UnitType> getUnitTypes() {
|
||||||
|
return unitTypeDAO.getAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initCreate() {
|
||||||
|
this.unitTypeState = UnitType.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public void initEdit(UnitType unitType) {
|
||||||
|
Validate.notNull(unitType);
|
||||||
|
this.unitTypeState = getFromDB(unitType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private UnitType getFromDB(UnitType unitType) {
|
||||||
|
try {
|
||||||
|
return unitTypeDAO.find(unitType.getId());
|
||||||
|
} catch (InstanceNotFoundException e) {
|
||||||
|
LOG.error(_("It was not possible load entity. Not found. Id: " +
|
||||||
|
unitType.getId()), e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UnitType getCurrentUnitType() {
|
||||||
|
return this.unitTypeState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void confirmSave() throws ValidationException {
|
||||||
|
unitTypeDAO.save(this.unitTypeState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public boolean existsAnotherUnitTypeWithName(String name) {
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
try {
|
||||||
|
UnitType foundUnitType =
|
||||||
|
unitTypeDAO.findByNameCaseInsensitive(name);
|
||||||
|
result = isTheSameEntityAsState(foundUnitType) ? false : true;
|
||||||
|
} catch (InstanceNotFoundException e) {
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public boolean existsAnotherUnitTypeWithCode(String code) {
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
try {
|
||||||
|
UnitType foundUnitType =
|
||||||
|
unitTypeDAO.findByCode(code);
|
||||||
|
result = isTheSameEntityAsState(foundUnitType) ? false : true;
|
||||||
|
} catch (InstanceNotFoundException e) {
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isTheSameEntityAsState(UnitType foundUnitType) {
|
||||||
|
if (getCurrentUnitType().isNewObject()) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return foundUnitType.getId().equals(getCurrentUnitType().getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
public boolean isUnitTypeUsedInAnyMaterial(UnitType unitType) {
|
||||||
|
return unitTypeDAO.isUnitTypeUsedInAnyMaterial(unitType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void remove(UnitType unitType) {
|
||||||
|
try {
|
||||||
|
unitTypeDAO.remove(unitType.getId());
|
||||||
|
} catch (InstanceNotFoundException e) {
|
||||||
|
LOG.error("Trying to remove unit type with id " + unitType.getId() +
|
||||||
|
" but it is not found in the database",e);
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
<!--
|
||||||
|
This file is part of NavalPlan
|
||||||
|
|
||||||
|
Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
|
||||||
|
Desenvolvemento Tecnolóxico de Galicia
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
-->
|
||||||
|
<window id="${arg.top_id}" title="${arg.title}">
|
||||||
|
<tabbox>
|
||||||
|
<tabs>
|
||||||
|
<tab label="${i18n:_('Edit')}"></tab>
|
||||||
|
</tabs>
|
||||||
|
<tabpanels>
|
||||||
|
<tabpanel>
|
||||||
|
<grid fixedLayout="true">
|
||||||
|
<columns>
|
||||||
|
<column width="200px" />
|
||||||
|
<column />
|
||||||
|
</columns>
|
||||||
|
|
||||||
|
<rows>
|
||||||
|
<row>
|
||||||
|
<label value="${i18n:_('Code')}"/>
|
||||||
|
<textbox
|
||||||
|
id="codeTextBox"
|
||||||
|
value="@{controller.unitType.code}"
|
||||||
|
constraint="@{controller.uniqueCode}"
|
||||||
|
width="300px"/>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<label value="${i18n:_('Unit measure name')}" />
|
||||||
|
<textbox
|
||||||
|
id="measureTextBox"
|
||||||
|
value="@{controller.unitType.measure}"
|
||||||
|
constraint="@{controller.uniqueMeasureName}"
|
||||||
|
width="300px"/>
|
||||||
|
</row>
|
||||||
|
</rows>
|
||||||
|
</grid>
|
||||||
|
</tabpanel>
|
||||||
|
</tabpanels>
|
||||||
|
</tabbox>
|
||||||
|
<button onClick="controller.saveAndExit();"
|
||||||
|
label="${arg.save_button_label}"
|
||||||
|
sclass="save-button global-action"/>
|
||||||
|
<button onClick="controller.saveAndContinue();"
|
||||||
|
label="${arg.save_and_continue_button_label}"
|
||||||
|
sclass="save-button global-action"/>
|
||||||
|
<button onClick="controller.cancel();"
|
||||||
|
label="${arg.cancel_button_label}"
|
||||||
|
sclass="cancel-button global-action"/>
|
||||||
|
</window>
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<!--
|
||||||
|
This file is part of NavalPlan
|
||||||
|
|
||||||
|
Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
|
||||||
|
Desenvolvemento Tecnolóxico de Galicia
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<window id="${arg.top_id}" title="${i18n:_('Unit type list')}">
|
||||||
|
<newdatasortablegrid id="listing" model="@{controller.unitTypes}" mold="paging"
|
||||||
|
pageSize="10" fixedLayout="true"
|
||||||
|
rowRenderer="@{controller.unitTypeRenderer}" >
|
||||||
|
<columns>
|
||||||
|
<newdatasortablecolumn label="${i18n:_('Unit Measure')}"
|
||||||
|
sortDirection="ascending" sort="auto(measure)"/>
|
||||||
|
<newdatasortablecolumn label="${i18n:_('Operations')}"/>
|
||||||
|
</columns>
|
||||||
|
</newdatasortablegrid>
|
||||||
|
<button id="show_create_form" onClick="controller.goToEditFormInCreationMode();" label="${i18n:_('Create')}"
|
||||||
|
sclass="create-button global-action">
|
||||||
|
</button>
|
||||||
|
</window>
|
||||||
44
navalplanner-webapp/src/main/webapp/materials/unitTypes.zul
Normal file
44
navalplanner-webapp/src/main/webapp/materials/unitTypes.zul
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
<!--
|
||||||
|
This file is part of NavalPlan
|
||||||
|
|
||||||
|
Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
|
||||||
|
Desenvolvemento Tecnolóxico de Galicia
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
<?page title="${i18n:_('NavalPlan: Unit types')}" id="unitTypes"?>
|
||||||
|
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
|
||||||
|
<?init class="org.zkoss.zk.ui.util.Composition" arg0="/common/layout/template.zul"?>
|
||||||
|
|
||||||
|
<?link rel="stylesheet" type="text/css" href="/common/css/navalplan.css"?>
|
||||||
|
<?link rel="stylesheet" type="text/css" href="/common/css/navalplan_zk.css"?>
|
||||||
|
|
||||||
|
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
|
||||||
|
|
||||||
|
<?component name="list" inline="true" macroURI="_listUnitTypes.zul"?>
|
||||||
|
<?component name="edition" inline="true" macroURI="_editUnitType.zul"?>
|
||||||
|
|
||||||
|
<zk>
|
||||||
|
<window self="@{define(content)}"
|
||||||
|
apply="org.navalplanner.web.materials.UnitTypeController">
|
||||||
|
<vbox id="messagesContainer"/>
|
||||||
|
<list top_id="listWindow"/>
|
||||||
|
<edition top_id="editWindow"
|
||||||
|
title="${i18n:_('Edit unit type data')}"
|
||||||
|
save_button_label="${i18n:_('Save')}"
|
||||||
|
save_and_continue_button_label="${i18n:_('Save & Continue')}"
|
||||||
|
cancel_button_label="${i18n:_('Cancel')}"
|
||||||
|
/>
|
||||||
|
</window>
|
||||||
|
</zk>
|
||||||
Loading…
Add table
Reference in a new issue