001 package org.hackystat.projectbrowser.page.projects; 002 003 import org.apache.wicket.extensions.markup.html.form.DateTextField; 004 import org.apache.wicket.extensions.yui.calendar.DatePicker; 005 import org.apache.wicket.markup.html.basic.Label; 006 import org.apache.wicket.markup.html.form.Button; 007 import org.apache.wicket.markup.html.form.Form; 008 import org.apache.wicket.markup.html.form.ListMultipleChoice; 009 import org.apache.wicket.markup.html.form.SubmitLink; 010 import org.apache.wicket.markup.html.form.TextArea; 011 import org.apache.wicket.markup.html.form.TextField; 012 import org.apache.wicket.markup.html.list.ListItem; 013 import org.apache.wicket.markup.html.list.ListView; 014 import org.apache.wicket.markup.html.panel.Panel; 015 import org.apache.wicket.model.PropertyModel; 016 import org.hackystat.projectbrowser.ProjectBrowserSession; 017 import org.hackystat.projectbrowser.page.popupwindow.PopupWindowPanel; 018 import org.hackystat.sensorbase.client.SensorBaseClient; 019 import org.hackystat.sensorbase.client.SensorBaseClientException; 020 import org.hackystat.sensorbase.resource.projects.jaxb.Project; 021 022 /** 023 * Panel use to edit project. 024 * 025 * @author Shaoxuan Zhang 026 * @author Randy Cox 027 */ 028 public class ProjEditPanel extends Panel { 029 030 /** Support serialization. */ 031 private static final long serialVersionUID = 1L; 032 033 /** Date format used in date field input. */ 034 private static final String DATA_FORMAT = "yyyy-MM-dd"; 035 036 /** 037 * Constructor for this class. 038 * 039 * @param id the wicket id. 040 */ 041 public ProjEditPanel(String id) { 042 super(id); 043 044 final ProjectsSession session = ProjectBrowserSession.get().getProjectsSession(); 045 final ProjectsModel model = session.getProjectsModel(); 046 047 final Form projectForm = new Form("projEditForm"); 048 049 TextField projName = new TextField("projectName", new PropertyModel(model, "projectName")) { 050 /** Support serialization. */ 051 private static final long serialVersionUID = 1L; 052 053 /** Allows editing of project name if the record is brand new. */ 054 @Override 055 public boolean isEnabled() { 056 return ProjectBrowserSession.get().getProjectsSession().isNewProject(); 057 } 058 }; 059 projectForm.add(projName); 060 061 Label projOwner = new Label("projectOwner", new PropertyModel(model, "projectOwner")); 062 projOwner.setEscapeModelStrings(false); 063 projectForm.add(projOwner); 064 065 projectForm.add(new TextArea("projectDesc", new PropertyModel(model, "projectDesc"))); 066 067 DateTextField projectStartDate = new DateTextField("projectStartDate", new PropertyModel(model, 068 "projectStartDate"), DATA_FORMAT); 069 projectStartDate.add(new DatePicker()); 070 projectForm.add(projectStartDate); 071 072 DateTextField projectEndDate = new DateTextField("projectEndDate", new PropertyModel(model, 073 "projectEndDate"), DATA_FORMAT); 074 projectEndDate.add(new DatePicker()); 075 projectForm.add(projectEndDate); 076 077 final ListMultipleChoice projectMembers = new ListMultipleChoice("memberSelection", 078 new PropertyModel(model, "memberSelection"), new PropertyModel(model, "projectMembers")) { 079 /** Support serialization. */ 080 public static final long serialVersionUID = 1L; 081 082 /** Turns this choice box off when no members are present. */ 083 @Override 084 public boolean isVisible() { 085 return (!getChoices().isEmpty()); 086 } 087 }; 088 projectMembers.setMaxRows(5); 089 projectForm.add(projectMembers); 090 091 SubmitLink deleteMemberLink = new SubmitLink("deleteMemberLink") { 092 /** Support serialization. */ 093 private static final long serialVersionUID = 1L; 094 095 /** Delete selected member from projectMembers list. */ 096 @Override 097 public void onSubmit() { 098 ProjectsSession session = ProjectBrowserSession.get().getProjectsSession(); 099 ProjectsModel model = session.getProjectsModel(); 100 model.removeMembers(model.getMemberSelection()); 101 } 102 }; 103 projectForm.add(deleteMemberLink); 104 105 TextArea projectMemberHelp = new TextArea("projectMemberHelp", new PropertyModel(model, 106 "projectMemberHelp")) { 107 /** Support serialization. */ 108 public static final long serialVersionUID = 1L; 109 110 /** Turns on when no project members. */ 111 @Override 112 public boolean isVisible() { 113 return (projectMembers.getChoices().isEmpty()); 114 } 115 }; 116 projectMemberHelp.setEnabled(false); 117 projectForm.add(projectMemberHelp); 118 119 projectForm.add(new TextArea("projectInvitations", new PropertyModel(model, 120 "projectInvitationsStr"))); 121 projectForm.add(new TextArea("projectSpectators", new PropertyModel(model, 122 "projectSpectatorsStr"))); 123 124 SubmitLink addPropUriLink = new SubmitLink("addPropUriLink") { 125 /** For serialization. */ 126 private static final long serialVersionUID = 1L; 127 128 /** Add row */ 129 @Override 130 public void onSubmit() { 131 ProjectsSession session = ProjectBrowserSession.get().getProjectsSession(); 132 ProjectsModel model = session.getProjectsModel(); 133 model.addPropUriRow(); 134 } 135 }; 136 projectForm.add(addPropUriLink); 137 138 final ListView projectTable = new ListView("propertyUriRowsTable", new PropertyModel(model, 139 "propUriRowsView")) { 140 /** For serialization. */ 141 private static final long serialVersionUID = 1L; 142 143 /** Add one row of table. */ 144 @Override 145 public void populateItem(final ListItem item) { 146 PropUriRowModel rowModel = (PropUriRowModel) item.getModelObject(); 147 item.add(new TextField("propertyLabel", new PropertyModel(rowModel, "propertyLabel"))); 148 item.add(new TextField("propertyValue", new PropertyModel(rowModel, "propertyValue"))); 149 item.add(new TextField("uriPattern1", new PropertyModel(rowModel, "uriPattern1"))); 150 item.add(new TextField("uriPattern2", new PropertyModel(rowModel, "uriPattern2"))); 151 item.add(new TextField("uriPattern3", new PropertyModel(rowModel, "uriPattern3"))); 152 } 153 }; 154 projectForm.add(projectTable); 155 156 Button saveButton = new Button("saveButton") { 157 /** For serialization. */ 158 private static final long serialVersionUID = 1L; 159 160 /** Save project. */ 161 @Override 162 public void onSubmit() { 163 ProjectsSession session = ProjectBrowserSession.get().getProjectsSession(); 164 ProjectsModel model = session.getProjectsModel(); 165 model.savePropUriRowsSave(); 166 167 if (model.isSemanticCheckOk()) { 168 Project project = model.getProject(); 169 SensorBaseClient client = ProjectBrowserSession.get().getSensorBaseClient(); 170 171 try { 172 client.putProject(project); 173 session.getProjEditPanel().setVisible(false); 174 session.getProjListPanel().setVisible(true); 175 } 176 catch (SensorBaseClientException e) { 177 model.setFeedback(e.getMessage()); 178 } 179 } 180 } 181 }; 182 projectForm.add(saveButton); 183 184 Button cancelButton = new Button("cancelButton") { 185 /** For serialization. */ 186 private static final long serialVersionUID = 1L; 187 188 /** Cancel. */ 189 @Override 190 public void onSubmit() { 191 session.getProjEditPanel().setVisible(false); 192 session.getProjListPanel().setVisible(true); 193 } 194 }; 195 projectForm.add(cancelButton); 196 197 PopupWindowPanel popup = new PopupWindowPanel("helpPopup", "Project Entry Help"); 198 popup.getModalWindow().setContent(new ProjHelpPanel(popup.getModalWindow().getContentId())); 199 projectForm.add(popup); 200 201 Label feedbackLabel = new Label("saveFeedback", new PropertyModel(model, "feedback")); 202 session.setFeedbackLabel(feedbackLabel); 203 projectForm.add(feedbackLabel); 204 205 add(projectForm); 206 } 207 }