package com.qcadoo.mes.cmmsMachineParts.roles; import com.qcadoo.mes.cmmsMachineParts.constants.CmmsMachinePartsConstants; import com.qcadoo.mes.cmmsMachineParts.constants.MaintenanceEventFields; import com.qcadoo.mes.cmmsMachineParts.constants.PlannedEventFields; import com.qcadoo.mes.cmmsMachineParts.constants.PlannedEventType; import com.qcadoo.mes.cmmsMachineParts.states.constants.PlannedEventState; import com.qcadoo.model.api.Entity; import com.qcadoo.view.api.ComponentState; import com.qcadoo.view.api.ViewDefinitionState; import com.qcadoo.view.api.components.FormComponent; import com.qcadoo.view.api.components.GridComponent; import com.qcadoo.view.api.components.WindowComponent; import com.qcadoo.view.api.ribbon.Ribbon; import com.qcadoo.view.api.ribbon.RibbonActionItem; import com.qcadoo.view.api.ribbon.RibbonGroup; import java.util.List; import java.util.Optional; public enum PlannedEventRoles { ROLE_PLANNED_EVENTS_DOCUMENTS { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { hideTabs(view, "documentsTab"); } }, ROLE_PLANNED_EVENTS_HISTORY { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { hideTabs(view, "historyTab"); } }, ROLE_PLANNED_EVENTS_ATTACHMENTS { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { } }, ROLE_PLANNED_EVENTS_EDIT_RELATED { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { GridComponent grid = (GridComponent) view.getComponentByReference("relatedEvents"); if (grid != null) { grid.setEnabled(false); } } }, ROLE_PLANNED_EVENTS_ATTACHMENTS_REMOVE { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { GridComponent grid = (GridComponent) view.getComponentByReference("attachments"); if (grid != null) { grid.setEnabled(false); } } }, ROLE_PLANNED_EVENTS_STATES_START_STOP { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { if (shouldBeActive(view, PlannedEventState.ACCEPTED, Optional.of(PlannedEventType.METER_READING), false, false) || shouldBeActive(view, PlannedEventState.IN_REALIZATION, Optional.of(PlannedEventType.METER_READING), true, false) || shouldBeActive(view, PlannedEventState.IN_EDITING, Optional.of(PlannedEventType.METER_READING), true, false)) { lockFromRibbonGroup(view, "status", "realizedEvent"); } lockFromRibbonGroup(view, "status", "startEvent", "stopEvent"); } }, ROLE_PLANNED_EVENTS_STATES_ACCEPT { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { if (shouldBeActive(view, PlannedEventState.IN_REALIZATION, Optional.of(PlannedEventType.METER_READING), false, false)) { lockFromRibbonGroup(view, "status", "realizedEvent"); } lockFromRibbonGroup(view, "status", "planEvent", "plannedEvent"); } }, ROLE_PLANNED_EVENTS_STATES_OTHER { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { if (!shouldBeActive(view, PlannedEventState.IN_EDITING, Optional.empty(), false, false)) { lockFromRibbonGroup(view, "status", "planEvent", "plannedEvent"); } lockFromRibbonGroup(view, "status", "cancelEvent"); } }, ROLE_PLANNED_EVENTS_ADVANCED_EDIT { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { lockComponents(view, PlannedEventFields.NUMBER, PlannedEventFields.TYPE, PlannedEventFields.DESCRIPTION, PlannedEventFields.OWNER, PlannedEventFields.PLANNED_SEPARATELY, PlannedEventFields.REQUIRES_SHUTDOWN, PlannedEventFields.BASED_ON, PlannedEventFields.DATE, PlannedEventFields.COUNTER, PlannedEventFields.COUNTER_TOLERANCE, PlannedEventFields.DURATION, PlannedEventFields.COMPANY, PlannedEventFields.SOURCE_COST); } }, ROLE_PLANNED_EVENTS_BASIC_EDIT { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { FormComponent form = (FormComponent) view.getComponentByReference("form"); Entity plannedEvent = form.getEntity(); if (plannedEvent.getDataDefinition().getName().equals(CmmsMachinePartsConstants.MODEL_PLANNED_EVENT)) { lockComponents(view, PlannedEventFields.FACTORY, PlannedEventFields.DIVISION, PlannedEventFields.PRODUCTION_LINE, PlannedEventFields.WORKSTATION, PlannedEventFields.SUBASSEMBLY, PlannedEventFields.EFFECTIVE_COUNTER, PlannedEventFields.EFFECTIVE_DURATION, PlannedEventFields.ACTIONS, PlannedEventFields.SOLUTION_DESCRIPTION, PlannedEventFields.RELATED_EVENTS, PlannedEventFields.REALIZATIONS, PlannedEventFields.MACHINE_PARTS_FOR_EVENT); } } }, ROLE_PLANNED_EVENTS_DATES_EDIT { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { lockComponents(view, PlannedEventFields.START_DATE, PlannedEventFields.FINISH_DATE, PlannedEventFields.IS_DEADLINE, PlannedEventFields.RESPONSIBLE_WORKERS); } }, ROLE_PLANNED_EVENTS_ACTIONS_VIEW { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { } }, ROLE_PLANNED_EVENTS_ACTIONS_EDIT { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { lockFromRibbonGroup(view, "actions", "save", "copy", "saveBack", "cancel"); } }, ROLE_PLANNED_EVENTS_ACTIONS_REMOVE { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { lockFromRibbonGroup(view, "actions", "delete"); } }, ROLE_PLANNED_EVENTS_ACTIONS_ADD { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { lockFromRibbonGroup(view, "actions", "copy"); } }, ROLE_EVENTS { @Override public void disableFieldsWhenNotInRole(ViewDefinitionState view) { lockFromRibbonGroup(view, "maintenanceEvents", "showMaintenanceEvent"); } }; public void disableFieldsWhenNotInRole(ViewDefinitionState view) { } protected void lockFromRibbonGroup(ViewDefinitionState view, String groupName, String... items) { WindowComponent window = (WindowComponent) view.getComponentByReference("window"); Ribbon ribbon = window.getRibbon(); RibbonGroup ribbonGroup = ribbon.getGroupByName(groupName); if (ribbonGroup != null) { for (String item : items) { RibbonActionItem ribbonItem = ribbonGroup.getItemByName(item); if (ribbonItem != null) { ribbonItem.setEnabled(false); ribbonItem.requestUpdate(true); } } } } protected void hideTabs(ViewDefinitionState view, String... tabs) { for (String tab : tabs) { ComponentState tabComponent = view.getComponentByReference(tab); if (tabComponent != null) { tabComponent.setVisible(false); } } } protected void lockComponents(ViewDefinitionState view, String... components) { for (String component : components) { ComponentState componentState = view.getComponentByReference(component); if (componentState != null) { componentState.setEnabled(false); } } } protected boolean shouldBeActive(ViewDefinitionState view, PlannedEventState state, Optional<PlannedEventType> type, boolean typeEquals, boolean singleRow) { FormComponent form = (FormComponent) view.getComponentByReference("form"); Entity event = form.getEntity(); String eventState = event.getStringField(PlannedEventFields.STATE); if (eventState == null) { GridComponent grid = (GridComponent) view.getComponentByReference("grid"); List<Entity> entities = grid.getSelectedEntities(); if (singleRow) { if (entities.size() == 1) { event = entities.get(0); eventState = event.getStringField(PlannedEventFields.STATE); return state.getStringValue().equals(eventState) && checkEventType(event, type, typeEquals); } else { return false; } } boolean statesEquals = entities.stream().allMatch( e -> state.getStringValue().equals(e.getStringField(MaintenanceEventFields.STATE))); if (type.isPresent()) { if (typeEquals) { return statesEquals && entities.stream().allMatch( e -> type.get().getStringValue().equals(e.getStringField(PlannedEventFields.TYPE))); } else { return statesEquals && entities.stream().noneMatch( e -> type.get().getStringValue().equals(e.getStringField(PlannedEventFields.TYPE))); } } return statesEquals; } return state.getStringValue().equals(eventState) && checkEventType(event, type, typeEquals); } private boolean checkEventType(final Entity event, Optional<PlannedEventType> type, boolean typeEquals) { String eventType = event.getStringField(PlannedEventFields.TYPE); boolean isType = true; if (type.isPresent()) { if (typeEquals) { isType = type.get().getStringValue().endsWith(eventType); } else { isType = !type.get().getStringValue().endsWith(eventType); } } return isType; } }