001 package org.kuali.student.lum.program.client.widgets;
002
003 import java.util.Date;
004
005 import org.kuali.student.common.assembly.data.Metadata;
006 import org.kuali.student.common.assembly.data.QueryPath;
007 import org.kuali.student.common.ui.client.application.ViewContext;
008 import org.kuali.student.common.ui.client.configurable.mvc.DefaultWidgetFactory;
009 import org.kuali.student.common.ui.client.configurable.mvc.binding.HasDataValueBinding;
010 import org.kuali.student.common.ui.client.mvc.DataModel;
011 import org.kuali.student.common.ui.client.mvc.HasDataValue;
012 import org.kuali.student.common.ui.client.mvc.history.HistoryManager;
013 import org.kuali.student.lum.common.client.widgets.AppLocations;
014 import org.kuali.student.lum.program.client.ProgramConstants;
015 import org.kuali.student.lum.program.client.ProgramUtils;
016 import org.kuali.student.lum.program.client.events.AfterSaveEvent;
017 import org.kuali.student.lum.program.client.events.ModelLoadedEvent;
018 import org.kuali.student.lum.program.client.major.MajorController;
019 import org.kuali.student.lum.program.client.properties.ProgramProperties;
020
021 import com.google.gwt.event.dom.client.ClickEvent;
022 import com.google.gwt.event.dom.client.ClickHandler;
023 import com.google.gwt.event.shared.HandlerManager;
024 import com.google.gwt.user.client.ui.Anchor;
025 import com.google.gwt.user.client.ui.Composite;
026 import com.google.gwt.user.client.ui.HorizontalPanel;
027 import com.google.gwt.user.client.ui.Label;
028 import com.google.gwt.user.client.ui.SimplePanel;
029 import com.google.gwt.user.client.ui.VerticalPanel;
030 import com.google.gwt.user.client.ui.Widget;
031
032 /**
033 * @author Igor
034 */
035 public class ProgramSideBar extends Composite {
036
037 private final VerticalPanel content = new VerticalPanel();
038
039 private State state = State.VIEW;
040
041 private Type type;
042
043 private Label versionLabel;
044 private Anchor viewVersion;
045 private Label historyLabel = new Label(ProgramProperties.get().sideBar_history());
046 private Label lastUpdatedDate = new Label();
047 private SimplePanel scheduledReviewDate = new SimplePanel();
048 private Label lastReviewDate = new Label();
049 private final HandlerManager eventBus;
050
051 private ViewContext viewContext;
052
053 private final SideBarDialogManager dialogManager;
054
055 public ProgramSideBar(HandlerManager eventBus, Type type) {
056 this.eventBus = eventBus;
057 this.type = type;
058 dialogManager = new SideBarDialogManager(eventBus);
059 initWidget(content);
060 setStyles();
061 buildLayout();
062 bind();
063 }
064
065 public void initialize(MajorController controller) {
066 DataModel model = controller.getProgramModel();
067 dialogManager.configureView(model.getDefinition(), controller);
068 viewContext = controller.getViewContext();
069 updateFields(model);
070 }
071
072 private void bind() {
073 eventBus.addHandler(ModelLoadedEvent.TYPE, new ModelLoadedEvent.Handler() {
074 @Override
075 public void onEvent(ModelLoadedEvent event) {
076 updateFields(event.getModel());
077 }
078 });
079 eventBus.addHandler(AfterSaveEvent.TYPE, new AfterSaveEvent.Handler() {
080 @Override
081 public void onEvent(AfterSaveEvent event) {
082 DataModel model = event.getModel();
083 dialogManager.configureView(model.getDefinition(), event.getController());
084 updateFields(event.getModel());
085 }
086 });
087 }
088
089 private void updateFields(DataModel model) {
090 String programType = model.get(ProgramConstants.TYPE);
091
092 //The sidebar fields should only be updated if the model that was changed/loaded is associated with the sidebar
093 boolean doUpdate = (type == ProgramSideBar.Type.CORE && ProgramConstants.CORE_LU_TYPE_ID.equals(programType)) ||
094 (type == ProgramSideBar.Type.CREDENTIAL && programType.startsWith(ProgramConstants.CRED_LU_TYPE_PREFIX)) ||
095 (type == ProgramSideBar.Type.MAJOR && ProgramConstants.MAJOR_LU_TYPE_ID.equals(programType));
096
097 if (doUpdate){
098 setVersion((Long)model.get(ProgramConstants.VERSION), versionLabel);
099 setDate((Date) model.get(ProgramConstants.LAST_UPDATED_DATE), lastUpdatedDate);
100 lastReviewDate.setText((String) model.get(ProgramConstants.LAST_REVIEW_DATE));
101 setWidget(ProgramConstants.SCHEDULED_REVIEW_DATE, scheduledReviewDate, model);
102 }
103 }
104
105 private void setDate(Date updatedDate, Label lastUpdatedDate) {
106 if (updatedDate != null) {
107 lastUpdatedDate.setText(ProgramUtils.df.format(updatedDate));
108 } else {
109 lastUpdatedDate.setText("");
110 }
111 }
112
113 private void setVersion(Long version, Label versionaLabel){
114 if (version != null){
115 viewVersion.setVisible(version >= 1);
116 versionLabel.setText(ProgramProperties.get().sideBar_version(String.valueOf(version)));
117 } else {
118 versionLabel.setText(ProgramProperties.get().sideBar_version(""));
119 viewVersion.setVisible(false);
120 }
121 }
122
123 private void setWidget(String path, SimplePanel container, DataModel model) {
124 Metadata mData = model.getMetadata(QueryPath.parse(path));
125
126 // CoreProgram and CredentialProgram don't have SCHEDULED_REVIEW_DATE
127 if (null == mData && ProgramConstants.SCHEDULED_REVIEW_DATE.equals(path)) {
128 return;
129 }
130 Widget widget = DefaultWidgetFactory.getInstance().getReadOnlyWidget(model.getMetadata(QueryPath.parse(path)));
131 HasDataValueBinding.INSTANCE.setWidgetValue((HasDataValue) widget, model, path);
132 container.setWidget(widget);
133 }
134
135
136 private void buildLayout() {
137 content.clear();
138 Label history = new Label(ProgramProperties.get().sideBar_history());
139 history.addStyleName("KS-Program-History");
140 content.add(history);
141
142 content.add(createVersionPanel());
143 content.add(createDatePanel(ProgramProperties.get().sideBar_programLastUpdated(), lastUpdatedDate, false));
144 if (type == Type.MAJOR) {
145 content.add(createDatePanel(ProgramProperties.get().sideBar_scheduledReviewDate(), scheduledReviewDate, true));
146 content.add(createDatePanel(ProgramProperties.get().sideBar_lastReviewDate(), lastReviewDate, true));
147 }
148 content.add(createVersionHistoryPanel());
149 }
150
151 private Widget createDatePanel(String title, Widget widget, boolean showEdit) {
152 VerticalPanel verticalPanel = new VerticalPanel();
153 HorizontalPanel datePanel = new HorizontalPanel();
154 datePanel.addStyleName("datePanel");
155 datePanel.add(widget);
156 if (state == State.EDIT && showEdit) {
157 Anchor edit = new Anchor(ProgramProperties.get().common_edit());
158 edit.addClickHandler(new ClickHandler() {
159
160 @Override
161 public void onClick(ClickEvent event) {
162 dialogManager.show();
163 }
164 });
165 datePanel.add(edit);
166 }
167 verticalPanel.add(new Label(title));
168 verticalPanel.add(datePanel);
169 return verticalPanel;
170 }
171
172 private Widget createHistoryPanel(){
173 VerticalPanel verticalPanel = new VerticalPanel();
174 versionLabel = new Label(ProgramProperties.get().sideBar_version(""));
175 verticalPanel.add(versionLabel);
176 return verticalPanel;
177 }
178
179 private Widget createVersionPanel(){
180 VerticalPanel verticalPanel = new VerticalPanel();
181 versionLabel = new Label(ProgramProperties.get().sideBar_version(""));
182 verticalPanel.add(versionLabel);
183 return verticalPanel;
184 }
185
186 private Widget createVersionHistoryPanel(){
187 VerticalPanel verticalPanel = new VerticalPanel();
188 viewVersion = new Anchor(ProgramProperties.get().sideBar_viewHistory());
189 viewVersion.addClickHandler(new ClickHandler(){
190 @Override
191 public void onClick(ClickEvent event) {
192 switch (type){
193 case MAJOR: HistoryManager.navigate(AppLocations.Locations.VIEW_PROGRAM_VERSIONS.getLocation()); break;
194 case CORE: HistoryManager.navigate(AppLocations.Locations.VIEW_CORE_VERSIONS.getLocation()); break;
195 case CREDENTIAL: HistoryManager.navigate(AppLocations.Locations.VIEW_BACC_VERSIONS.getLocation()); break;
196 }
197
198
199 }
200
201 });
202 //viewVersion.setVisible(false);
203
204 verticalPanel.add(viewVersion);
205
206 return verticalPanel;
207 }
208
209 public void setState(State state) {
210 this.state = state;
211 buildLayout();
212 }
213
214 private void setStyles() {
215 content.addStyleName("sideBar");
216 content.addStyleName("KS-Program-History-Sidebar");
217 historyLabel.addStyleName("history");
218 }
219
220 public static enum State {
221 EDIT,
222 VIEW
223 }
224
225 public static enum Type {
226 CREDENTIAL,
227 CORE,
228 MAJOR
229 }
230 }