package com.qcadoo.mes.cmmsMachineParts.roles;
import java.util.List;
import com.qcadoo.mes.cmmsMachineParts.constants.MaintenanceEventFields;
import com.qcadoo.mes.cmmsMachineParts.states.constants.MaintenanceEventState;
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;
public enum EventRoles {
ROLE_EVENTS_DELETE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "actions", "delete");
}
},
ROLE_EVENTS_START {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
if (!eventInState(view, MaintenanceEventState.IN_PROGRESS)) {
lockFromRibbonGroup(view, "status", "startEvent");
}
}
},
ROLE_EVENTS_STOP {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
if (eventInState(view, MaintenanceEventState.IN_PROGRESS)) {
lockFromRibbonGroup(view, "status", "startEvent");
}
}
},
ROLE_EVENTS_PLAN {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
if (!eventInState(view, MaintenanceEventState.EDITED)) {
lockFromRibbonGroup(view, "status", "planEvent");
}
}
},
ROLE_EVENTS_REVOKE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "status", "revokeEvent");
}
},
ROLE_EVENTS_CLOSE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
if (!eventInState(view, MaintenanceEventState.EDITED)) {
lockFromRibbonGroup(view, "status", "closeEvent");
}
}
},
ROLE_EVENTS_ACCEPT {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
if (eventInState(view, MaintenanceEventState.EDITED)) {
lockFromRibbonGroup(view, "status", "closeEvent", "planEvent");
}
}
},
ROLE_EVENTS_ADD_FAILURE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "customActions", "addFailure");
}
},
ROLE_EVENTS_ADD_ISSUE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "customActions", "addIssue");
}
},
ROLE_EVENTS_ADD_PROPOSAL {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "customActions", "addProposal");
}
},
ROLE_EVENTS_TAB_DOCUMENTS {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
hideTabs(view, "documentsTab");
}
},
ROLE_EVENTS_TAB_HISTORY {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
hideTabs(view, "history");
}
},
ROLE_EVENTS_TAB_ATTACHMENTS {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
hideTabs(view, "attachmentsTab");
}
},
ROLE_EVENTS_SOURCE_COST_CHANGE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockComponents(view, "sourceCost");
}
},
ROLE_EVENTS_DELETE_ATTACHMENT {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockComponents(view, "attachments");
}
},
ROLE_EVENTS_EDIT_AFTER_SAVE {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
ComponentState contextTab = view.getComponentByReference("contextTab");
FormComponent form = (FormComponent) view.getComponentByReference("form");
if (contextTab == null && form != null && form.getEntity().getId() != null) {
lockComponents(view, "number", "type", "factory", "division", "productionLine", "workstation", "subassembly",
"faultType", "description", "personReceiving", "sourceCost");
}
}
},
ROLE_EVENTS_VIEW_PARTS_TIME_DESCRIPTION {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
FormComponent form = (FormComponent) view.getComponentByReference("form");
if (form != null && form.getEntity().getId() != null) {
lockComponents(view, "machinePartsForEvent", "staffWorkTimes", "solutionDescription");
}
}
},
ROLE_EVENTS_LIST_EXPORT {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "genericExport", "csv", "pdf");
}
},
ROLE_PLANNED_EVENTS_ACTIONS_VIEW {
@Override
public void disableFieldsWhenNotInRole(ViewDefinitionState view) {
lockFromRibbonGroup(view, "plannedEvents", "showPlannedEvent");
}
};
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 eventInState(ViewDefinitionState view, MaintenanceEventState state) {
FormComponent form = (FormComponent) view.getComponentByReference("form");
Entity event = form.getEntity();
String eventState = event.getStringField(MaintenanceEventFields.STATE);
if (eventState == null) {
GridComponent grid = (GridComponent) view.getComponentByReference("grid");
List<Entity> entities = grid.getSelectedEntities();
return entities.stream().allMatch(e -> state.getStringValue().equals(e.getStringField(MaintenanceEventFields.STATE)));
}
return state.getStringValue().equals(eventState);
}
}