diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java index ad0f0f9a2..3bce142c5 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java @@ -703,7 +703,6 @@ public class OrderCRUDController extends GenericForwardComposer { if (orderElementTreeController != null) { orderElementTreeController.resetCellsMarkedAsModified(); } - initialStatus = ((Order) orderModel.getOrder()).getState(); updateDisabilitiesOnInterface(); refreshCodeTextboxesOnly(); getVisibility().showOnly(editWindow); @@ -965,7 +964,6 @@ public class OrderCRUDController extends GenericForwardComposer { private void prepareEditWindow() { addEditWindowIfNecessary(); - initialStatus = ((Order) orderModel.getOrder()).getState(); updateDisabilitiesOnInterface(); setupOrderElementTreeController(); selectDefaultTab(); @@ -1447,15 +1445,14 @@ public class OrderCRUDController extends GenericForwardComposer { private boolean readOnly = true; - private OrderStatusEnum initialStatus; - private void updateDisabilitiesOnInterface() { Order order = (Order) orderModel.getOrder(); boolean permissionForWriting = orderModel.userCanWrite(order, SecurityUtils.getSessionUserLoginName()); boolean isInStoredState = order.getState() == OrderStatusEnum.STORED; - boolean isInitiallyStored = initialStatus == OrderStatusEnum.STORED; + boolean isInitiallyStored = orderModel.getPlanningState() + .getSavedOrderState() == OrderStatusEnum.STORED; readOnly = !permissionForWriting || isInStoredState; diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java index 65076bbd5..cc9ae8f8f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java @@ -327,8 +327,7 @@ public class OrderPlanningModel implements IOrderPlanningModel { .calculateDefaultLevel(configuration); configureInitialZoomLevelFor(planner, defaultZoomLevel); - final boolean writingAllowed = isWritingAllowedOn(planningState - .getOrder()); + final boolean writingAllowed = isWritingAllowedOnOrder(); ISaveCommand saveCommand = setupSaveCommand(configuration, writingAllowed); setupEditingCapabilities(configuration, writingAllowed); @@ -975,15 +974,16 @@ public class OrderPlanningModel implements IOrderPlanningModel { } } - private boolean isWritingAllowedOn(Order order) { - if (order.getState() == OrderStatusEnum.STORED) { - //STORED orders can't be saved, independently of user permissions + private boolean isWritingAllowedOnOrder() { + if (planningState.getSavedOrderState() == OrderStatusEnum.STORED + && planningState.getOrder().getState() == OrderStatusEnum.STORED) { + // STORED orders can't be saved, independently of user permissions return false; } if (SecurityUtils.isUserInRole(UserRole.ROLE_EDIT_ALL_ORDERS)) { return true; } - return thereIsWriteAuthorizationFor(order); + return thereIsWriteAuthorizationFor(planningState.getOrder()); } private boolean thereIsWriteAuthorizationFor(Order order) { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java index caa30ca48..f5dec3374 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java @@ -44,6 +44,7 @@ import org.libreplan.business.orders.daos.IOrderDAO; import org.libreplan.business.orders.entities.HoursGroup; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; +import org.libreplan.business.orders.entities.OrderStatusEnum; import org.libreplan.business.orders.entities.TaskSource; import org.libreplan.business.orders.entities.TaskSource.IOptionalPersistence; import org.libreplan.business.orders.entities.TaskSource.TaskSourceSynchronization; @@ -687,6 +688,8 @@ public class PlanningStateCreator { private List orderAuthorizationsAddition = new ArrayList(); private List orderAuthorizationsRemoval = new ArrayList(); + private OrderStatusEnum savedOrderState; + public PlanningState(Order order, Collection initialResources, Scenario currentScenario) { @@ -699,6 +702,7 @@ public class PlanningStateCreator { .loadRequiredDataFor(new HashSet(initialResources)); associateWithScenario(this.resources); this.orderAuthorizations = loadOrderAuthorizations(); + this.savedOrderState = order.getState(); } private List loadOrderAuthorizations() { @@ -1061,6 +1065,14 @@ public class PlanningStateCreator { orderAuthorizationsRemoval.clear(); } + public OrderStatusEnum getSavedOrderState() { + return savedOrderState; + } + + public void updateSavedOrderState() { + savedOrderState = order.getState(); + } + } public interface IAllocationCriteria { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java index 314dfe9c0..28c2363c2 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java @@ -367,6 +367,8 @@ public class SaveCommandBuilder { saveOrderAuthorizations(); removeTaskElementsWithTaskSourceNull(); + + state.updateSavedOrderState(); } private void removeTaskElementsWithTaskSourceNull() {