/* * OneCMDB, an open source configuration management project. * Copyright 2007, Lokomo Systems AB, and individual contributors * as indicated by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.onecmdb.ui.gwt.itil.client.application.problem.screen; import java.util.Arrays; import java.util.List; import org.gwtiger.client.widget.field.Validate; import org.onecmdb.ui.gwt.toolkit.client.control.OneCMDBConnector; import org.onecmdb.ui.gwt.toolkit.client.control.OneCMDBSession; import org.onecmdb.ui.gwt.toolkit.client.control.OneCMDBUtils; import org.onecmdb.ui.gwt.toolkit.client.control.input.AttributeControl; import org.onecmdb.ui.gwt.toolkit.client.control.input.AttributeValue; import org.onecmdb.ui.gwt.toolkit.client.control.input.CIDescriptionControl; import org.onecmdb.ui.gwt.toolkit.client.control.input.DefaultAttributeFilter; import org.onecmdb.ui.gwt.toolkit.client.control.input.IAttributeFilter; import org.onecmdb.ui.gwt.toolkit.client.control.input.TextAttributeControl; import org.onecmdb.ui.gwt.toolkit.client.control.table.CIReferenceTableControl; import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_CiBean; import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_ValueBean; import org.onecmdb.ui.gwt.toolkit.client.view.ci.LabelCounter; import org.onecmdb.ui.gwt.toolkit.client.view.input.AttributeRender; import org.onecmdb.ui.gwt.toolkit.client.view.input.ValidateVerticalPanel; import org.onecmdb.ui.gwt.toolkit.client.view.input.basefield.NewTextFieldWidget; import org.onecmdb.ui.gwt.toolkit.client.view.popup.DragablePopup; import org.onecmdb.ui.gwt.toolkit.client.view.screen.ci.EditCIScreen; import org.onecmdb.ui.gwt.toolkit.client.view.table.CITablePageControlPanel; import org.onecmdb.ui.gwt.toolkit.client.view.table.CITablePanel; import com.google.gwt.user.client.History; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CellPanel; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.KeyboardListener; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class EditProblemScreen extends EditCIScreen { TextAttributeControl addHistory = new TextAttributeControl("Action Note", false, false, TextAttributeControl.TEXT_BOX_TYPE, new Integer(1), null); TextAttributeControl addSolution = new TextAttributeControl("solution", false, false, TextAttributeControl.TEXT_AREA_TYPE, new Integer(5), null); private ValidateVerticalPanel actionHistory; private HTML actionInfo; private CIReferenceTableControl refIncidentControl; private HorizontalPanel incidentConnectedPanel = new HorizontalPanel(); private AttributeControl[] orders = new AttributeControl[] { new AttributeControl("ID", true, false), new AttributeControl("title", false, true), new CIDescriptionControl(), //new TextAttributeControl("opDescription", false, false, TextAttributeControl.TEXT_AREA_TYPE, new Integer(5), null), new AttributeControl("affectedCIs", false, false), //new AttributeControl("problem", true, false), new AttributeControl("priority", false, false), new AttributeControl("status", true, false), /* new AttributeControl("reportedBy", true, false), new AttributeControl("reportedDate", true, false), */ new AttributeControl("ticketIssuer", true, false), new AttributeControl("actionHistory", true, false), //addHistory, addSolution }; private static DefaultAttributeFilter defFilter = new DefaultAttributeFilter(); public EditProblemScreen() { super(); setTitleText("Edit Problem/Known Error"); defFilter.setAttributeControl(Arrays.asList(orders)); } public void onLoadComplete(Object sender) { showLoading(false); updateActionInfo(); } protected CellPanel getMainPanel() { return(new HorizontalPanel()); } public void load(String objectType, Long objectId) { input.clear(); updateConnectedIncidents(objectType); update(objectType); } protected void updateConnectedIncidents(String objectType) { // Add Number of incidents connected to this problem. refIncidentControl = new CIReferenceTableControl(objectType, "<$template{ITIL_Incident}", "ITIL_Incident"); LabelCounter counter = new LabelCounter("Incidents connected", refIncidentControl); Button viewIncidents = new Button("View"); viewIncidents.addClickListener(new ClickListener() { public void onClick(Widget sender) { DefaultAttributeFilter aFilter = new DefaultAttributeFilter(); aFilter.setSimpleAttributeControl(ListProblemScreen.getOrder()); refIncidentControl.setAttributeFilter(aFilter); CITablePanel table = new CITablePanel(); table.setAttributeRender(new AttributeRender()); table.setTabelControl(refIncidentControl); CITablePageControlPanel tablePageControl = new CITablePageControlPanel(table); table.load(); VerticalPanel vPanel = new VerticalPanel(); vPanel.add(tablePageControl); vPanel.add(table); vPanel.setCellVerticalAlignment(tablePageControl, VerticalPanel.ALIGN_TOP); vPanel.setCellVerticalAlignment(table, VerticalPanel.ALIGN_TOP); final DragablePopup popup = new DragablePopup("Incidents", true); popup.setContent(vPanel); int top = dockPanel.getAbsoluteTop() + 50; int left = dockPanel.getAbsoluteLeft() + 50; popup.setPopupPosition(left, top); popup.show(); } }); counter.update(); incidentConnectedPanel.clear(); incidentConnectedPanel.add(counter); incidentConnectedPanel.add(viewIncidents); incidentConnectedPanel.setCellHorizontalAlignment(counter, HorizontalPanel.ALIGN_LEFT); incidentConnectedPanel.setCellHorizontalAlignment(viewIncidents, HorizontalPanel.ALIGN_RIGHT); } protected void updateActionInfo() { GWT_ValueBean vBean = control.getLocal().fetchAttributeValueBean("status", 0); String alias = vBean.getValue(); OneCMDBConnector.getCIFromAlias(alias, new AsyncCallback() { public void onFailure(Throwable caught) { // TODO Auto-generated method stub } public void onSuccess(Object result) { if (result instanceof GWT_CiBean) { String displayName = ((GWT_CiBean)result).getDisplayName(); actionInfo.setHTML("This Problem has status <em>" + displayName + "</em>.<br/> What do you like to do now?"); } } }); } public IAttributeFilter getAttributeFilter() { return(defFilter); } public Widget getButtonPanel() { VerticalPanel vPanel = new VerticalPanel(); Label actionHeader = new Label("Take Action on this Problem", false); actionHeader.setStyleName("mdv-form-label"); vPanel.add(actionHeader); actionInfo = new HTML("This Problem has status (Loading). <br/>" + "What do you like to do now?", true); actionInfo.setStyleName("one-action-header"); vPanel.add(actionInfo); // Action history AttributeRender render = new AttributeRender(); //actionHistory = render.getWidget(); Label actionNote = new Label("Action Note"); actionNote.setStyleName("mdv-form-label"); final NewTextFieldWidget field = new NewTextFieldWidget((AttributeValue)addHistory.allocAttributeValue(null, null)); field.getBaseField().setVisible(false); actionHistory = new ValidateVerticalPanel(field); actionHistory.add(field); // Workaround to get the input box below label. // Didn't what to modify gwtiger framework right now.... final TextBox box = new TextBox(); box.addKeyboardListener(new KeyboardListener() { public void onKeyDown(Widget sender, char keyCode, int modifiers) { // TODO Auto-generated method stub } public void onKeyPress(Widget sender, char keyCode, int modifiers) { // TODO Auto-generated method stub } public void onKeyUp(Widget sender, char keyCode, int modifiers) { field.setText(box.getText()); } }); box.setStyleName("mdv-form-input"); actionHistory.add(box); //actionHistory = new NewTextFieldWidget("New Action", "250px"); //actionHistory.setRequired(true); //actionHistory.setStyleName("one-action-input"); // UI Action. Button problem = new Button("OK", new ClickListener() { public void onClick(Widget sender) { saveAsProblem(); } }); HorizontalPanel problemAction = new HorizontalPanel(); HTML problemText = new HTML("<b>Save this Problem with status <em>Problem</em></b>"); problemText.setTitle("Update Action history and " + "save the Problem with status " + "<em>Problem</em>."); problemAction.add(problemText); problemAction.add(problem); problemAction.setCellHorizontalAlignment(problem, HorizontalPanel.ALIGN_RIGHT); problemAction.setCellHorizontalAlignment(problemText, HorizontalPanel.ALIGN_LEFT); problemAction.setStyleName("incident-action-select"); // Close Action. Button knownError = new Button("OK", new ClickListener() { public void onClick(Widget sender) { saveAsKnownError(); } }); HorizontalPanel knownErrorAction = new HorizontalPanel(); HTML knownErrorText = new HTML("<b>Save this Problem with status <em>Known Error</em></b>"); knownErrorText.setTitle("Update Action history and " + "save the Problem with status <em>" + "Known Error<em>"); knownErrorAction.add(knownErrorText); knownErrorAction.add(knownError); knownErrorAction.setCellHorizontalAlignment(knownError, HorizontalPanel.ALIGN_RIGHT); knownErrorAction.setCellHorizontalAlignment(knownErrorText, HorizontalPanel.ALIGN_LEFT); knownErrorAction.setStyleName("incident-action-select"); incidentConnectedPanel.setStyleName("incident-action-select"); vPanel.add(problemAction); vPanel.add(knownErrorAction); vPanel.add(actionHistory); vPanel.add(incidentConnectedPanel); return(vPanel); } /* protected Widget getButtonPanel() { HorizontalPanel panel = new HorizontalPanel(); Button knownError = new Button("Known Error", new ClickListener() { public void onClick(Widget sender) { saveAsKnownError(); } }); Button problem = new Button("Problem", new ClickListener() { public void onClick(Widget sender) { saveAsProblem(); } }); problem.setTitle("Save this problem with a added Comment"); knownError.setTitle("Save this problem as an Known Error with a Solution/Workaround"); panel.add(problem); panel.add(knownError); panel.setCellHorizontalAlignment(problem, HorizontalPanel.ALIGN_CENTER); panel.setCellHorizontalAlignment(knownError, HorizontalPanel.ALIGN_CENTER); return(panel); } */ protected void saveAsProblem() { addSolution.setRequiered(false); if (!super.validate()) { return; } if (actionHistory instanceof Validate) { addHistory.setRequiered(true); if (!((Validate)actionHistory).validate()) { return; } } GWT_ValueBean vBean = control.getLocal().fetchAttributeValueBean("status", 0); vBean.setComplexValue(true); vBean.setValue("problemStatus_Problem"); Object object = addHistory.getAttributeValue(); String action = ((AttributeValue)object).getStringValue(); // Create a Action History entry. allocNewActionHistory(action, new AsyncCallback() { public void onFailure(Throwable caught) { setErrorText("ERROR: " + caught); } public void onSuccess(Object result) { if (result instanceof GWT_CiBean) { GWT_ValueBean actionRef = new GWT_ValueBean(); actionRef.setAlias("actionHistory"); actionRef.setComplexValue(true); actionRef.setValue(((GWT_CiBean)result).getAlias()); control.getLocal().addAttributeValue(actionRef); control.addNewBean(((GWT_CiBean)result)); // Make sure all incidents is marked as problem fetchIncidents(new AsyncCallback() { public void onFailure(Throwable caught) { setErrorText("Can't update incident status"); } public void onSuccess(Object result) { if (result instanceof List) { List l = (List)result; for (int i = 0; i < l.size(); i++) { GWT_CiBean incident = refIncidentControl.getObject(i+1); if (incident != null) { GWT_CiBean copy = incident.copy(); GWT_ValueBean vBean = copy.fetchAttributeValueBean("status", 0); if (vBean != null) { vBean.setValue("incidentStatus_Problem"); control.addModifiedBean(copy, incident); } } } save(); return; } } }); } } }); } protected void fetchIncidents(AsyncCallback callback) { // Select all. refIncidentControl.setMaxResult(null); refIncidentControl.setFirstItem(null); refIncidentControl.getRows(callback); } private void saveAsKnownError() { addSolution.setRequiered(true); if (!super.validate()) { return; } if (actionHistory instanceof Validate) { addHistory.setRequiered(true); if (!((Validate)actionHistory).validate()) { return; } } GWT_ValueBean vBean = control.getLocal().fetchAttributeValueBean("status", 0); vBean.setComplexValue(true); vBean.setValue("problemStatus_KnownError"); // Create a Action History entry. allocNewActionHistory("Marked this as a Known Problem", new AsyncCallback() { public void onFailure(Throwable caught) { setErrorText("ERROR: " + caught); } public void onSuccess(Object result) { if (result instanceof GWT_CiBean) { GWT_ValueBean actionRef = new GWT_ValueBean(); actionRef.setAlias("actionHistory"); actionRef.setComplexValue(true); actionRef.setValue(((GWT_CiBean)result).getAlias()); control.getLocal().addAttributeValue(actionRef); control.addNewBean(((GWT_CiBean)result)); // Make sure all incidents is marked as problem fetchIncidents(new AsyncCallback() { public void onFailure(Throwable caught) { setErrorText("Can't update incident status"); } public void onSuccess(Object result) { if (result instanceof List) { List l = (List)result; for (int i = 0; i < l.size(); i++) { GWT_CiBean incident = refIncidentControl.getObject(i+1); if (incident != null) { GWT_CiBean copy = incident.copy(); GWT_ValueBean vBean = copy.fetchAttributeValueBean("status", 0); if (vBean != null) { vBean.setValue("incidentStatus_KnownError"); control.addModifiedBean(copy, incident); } } } save(); return; } } }); } } }); } protected void allocNewActionHistory(String message, final AsyncCallback callback) { final GWT_CiBean bean = new GWT_CiBean(); bean.setDerivedFrom("ActionHistory"); bean.setTemplate(false); String xmlDateFormat = OneCMDBUtils.getXMLDateString(); GWT_ValueBean actionDate = new GWT_ValueBean("actionDate", xmlDateFormat, false); bean.addAttributeValue(actionDate); GWT_ValueBean actionMessage = new GWT_ValueBean("actionMessage", message, false); bean.addAttributeValue(actionMessage); // Alloc issuer loadTickIssuer().load(new AsyncCallback() { public void onFailure(Throwable caught) { callback.onFailure(caught); } public void onSuccess(Object result) { if (result instanceof GWT_CiBean) { GWT_ValueBean actionDate = new GWT_ValueBean("actionIssuer", ((GWT_CiBean)result).getAlias(), true); bean.addAttributeValue(actionDate); // Alloc alias. OneCMDBConnector.getInstance().newInstanceAlias(OneCMDBSession.getAuthToken(), "ActionHistory", new AsyncCallback() { public void onFailure(Throwable caught) { callback.onFailure(caught); } public void onSuccess(Object result) { if (result instanceof String) { bean.setAlias((String)result); callback.onSuccess(bean); } } }); } } }); } protected void onCommitSuccess(Object result) { History.back(); } }