1 package org.kuali.student.lum.program.client.widgets;
2
3 import java.util.Date;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.kuali.student.r1.common.assembly.data.Metadata;
8 import org.kuali.student.r1.common.assembly.data.QueryPath;
9 import org.kuali.student.common.ui.client.application.Application;
10 import org.kuali.student.common.ui.client.application.ViewContext;
11 import org.kuali.student.common.ui.client.configurable.mvc.DefaultWidgetFactory;
12 import org.kuali.student.common.ui.client.configurable.mvc.binding.HasDataValueBinding;
13 import org.kuali.student.common.ui.client.mvc.DataModel;
14 import org.kuali.student.common.ui.client.mvc.HasDataValue;
15 import org.kuali.student.common.ui.client.mvc.history.HistoryManager;
16 import org.kuali.student.lum.common.client.widgets.AppLocations;
17 import org.kuali.student.lum.program.client.ProgramConstants;
18 import org.kuali.student.lum.program.client.ProgramMsgConstants;
19 import org.kuali.student.lum.program.client.ProgramUtils;
20 import org.kuali.student.lum.program.client.events.AfterSaveEvent;
21 import org.kuali.student.lum.program.client.events.ModelLoadedEvent;
22 import org.kuali.student.lum.program.client.major.MajorController;
23
24 import com.google.gwt.event.dom.client.ClickEvent;
25 import com.google.gwt.event.dom.client.ClickHandler;
26 import com.google.gwt.event.shared.HandlerManager;
27 import com.google.gwt.user.client.ui.Anchor;
28 import com.google.gwt.user.client.ui.Composite;
29 import com.google.gwt.user.client.ui.HorizontalPanel;
30 import com.google.gwt.user.client.ui.Label;
31 import com.google.gwt.user.client.ui.SimplePanel;
32 import com.google.gwt.user.client.ui.VerticalPanel;
33 import com.google.gwt.user.client.ui.Widget;
34
35
36
37
38 public class ProgramSideBar extends Composite {
39
40 private final VerticalPanel content = new VerticalPanel();
41
42 private State state = State.VIEW;
43
44 private Type type;
45
46 private Label versionLabel;
47 private Anchor viewVersion;
48 private Label historyLabel = new Label(getLabel(ProgramMsgConstants.SIDEBAR_HISTORY));
49 private Label lastUpdatedDate = new Label();
50 private SimplePanel scheduledReviewDate = new SimplePanel();
51 private Label lastReviewDate = new Label();
52 private final HandlerManager eventBus;
53
54 private ViewContext viewContext;
55
56 private final SideBarDialogManager dialogManager;
57
58 public ProgramSideBar(HandlerManager eventBus, Type type) {
59 this.eventBus = eventBus;
60 this.type = type;
61 dialogManager = new SideBarDialogManager(eventBus);
62 initWidget(content);
63 setStyles();
64 buildLayout();
65 bind();
66 }
67
68 public void initialize(MajorController controller) {
69 DataModel model = controller.getProgramModel();
70 dialogManager.configureView(model.getDefinition(), controller);
71 viewContext = controller.getViewContext();
72 updateFields(model);
73 }
74
75 private void bind() {
76 eventBus.addHandler(ModelLoadedEvent.TYPE, new ModelLoadedEvent.Handler() {
77 @Override
78 public void onEvent(ModelLoadedEvent event) {
79 updateFields(event.getModel());
80 }
81 });
82 eventBus.addHandler(AfterSaveEvent.TYPE, new AfterSaveEvent.Handler() {
83 @Override
84 public void onEvent(AfterSaveEvent event) {
85 DataModel model = event.getModel();
86 dialogManager.configureView(model.getDefinition(), event.getController());
87 updateFields(event.getModel());
88 }
89 });
90 }
91
92 private void updateFields(DataModel model) {
93 String programType = model.get(ProgramConstants.TYPE);
94
95
96 boolean doUpdate = (type == ProgramSideBar.Type.CORE && ProgramConstants.CORE_LU_TYPE_ID.equals(programType)) ||
97 (type == ProgramSideBar.Type.CREDENTIAL && programType.startsWith(ProgramConstants.CRED_LU_TYPE_PREFIX)) ||
98 (type == ProgramSideBar.Type.MAJOR && ProgramConstants.MAJOR_LU_TYPE_ID.equals(programType));
99
100 if (doUpdate){
101 setVersion((Long)model.get(ProgramConstants.VERSION), versionLabel);
102 setDate((Date) model.get(ProgramConstants.LAST_UPDATED_DATE), lastUpdatedDate);
103 lastReviewDate.setText((String) model.get(ProgramConstants.LAST_REVIEW_DATE));
104 setWidget(ProgramConstants.SCHEDULED_REVIEW_DATE, scheduledReviewDate, model);
105 }
106 }
107
108 private void setDate(Date updatedDate, Label lastUpdatedDate) {
109 if (updatedDate != null) {
110 lastUpdatedDate.setText(ProgramUtils.df.format(updatedDate));
111 } else {
112 lastUpdatedDate.setText("");
113 }
114 }
115
116 private void setVersion(Long version, Label versionaLabel){
117 if (version != null){
118 viewVersion.setVisible(version >= 1);
119 versionLabel.setText(getLabel(ProgramMsgConstants.SIDEBAR_VERSION, String.valueOf(version)));
120 } else {
121 versionLabel.setText(getLabel(ProgramMsgConstants.SIDEBAR_VERSION, ""));
122 viewVersion.setVisible(false);
123 }
124 }
125
126 private void setWidget(String path, SimplePanel container, DataModel model) {
127 Metadata mData = model.getMetadata(QueryPath.parse(path));
128
129
130 if (null == mData && ProgramConstants.SCHEDULED_REVIEW_DATE.equals(path)) {
131 return;
132 }
133 Widget widget = DefaultWidgetFactory.getInstance().getReadOnlyWidget(model.getMetadata(QueryPath.parse(path)));
134 HasDataValueBinding.INSTANCE.setWidgetValue((HasDataValue) widget, model, path);
135 container.setWidget(widget);
136 }
137
138
139 private void buildLayout() {
140 content.clear();
141 Label history = new Label(getLabel(ProgramMsgConstants.SIDEBAR_HISTORY));
142 history.addStyleName("KS-Program-History");
143 content.add(history);
144
145 content.add(createVersionPanel());
146 content.add(createDatePanel(getLabel(ProgramMsgConstants.SIDEBAR_PROGRAMLASTUPDATED), lastUpdatedDate, false));
147 if (type == Type.MAJOR) {
148 content.add(createDatePanel(getLabel(ProgramMsgConstants.SIDEBAR_SCHEDULEDREVIEWDATE), scheduledReviewDate, true));
149 content.add(createDatePanel(getLabel(ProgramMsgConstants.SIDEBAR_LASTREVIEWDATE), lastReviewDate, true));
150 }
151 content.add(createVersionHistoryPanel());
152 }
153
154 private Widget createDatePanel(String title, Widget widget, boolean showEdit) {
155 VerticalPanel verticalPanel = new VerticalPanel();
156 HorizontalPanel datePanel = new HorizontalPanel();
157 datePanel.addStyleName("datePanel");
158 datePanel.add(widget);
159 if (state == State.EDIT && showEdit) {
160 Anchor edit = new Anchor(getLabel(ProgramMsgConstants.COMMON_EDIT));
161 edit.addClickHandler(new ClickHandler() {
162
163 @Override
164 public void onClick(ClickEvent event) {
165 dialogManager.show();
166 }
167 });
168 datePanel.add(edit);
169 }
170 verticalPanel.add(new Label(title));
171 verticalPanel.add(datePanel);
172 return verticalPanel;
173 }
174
175 private Widget createHistoryPanel(){
176 VerticalPanel verticalPanel = new VerticalPanel();
177 versionLabel = new Label(getLabel(ProgramMsgConstants.SIDEBAR_VERSION, ""));
178 verticalPanel.add(versionLabel);
179 return verticalPanel;
180 }
181
182 private Widget createVersionPanel(){
183 VerticalPanel verticalPanel = new VerticalPanel();
184 versionLabel = new Label(getLabel(ProgramMsgConstants.SIDEBAR_VERSION, ""));
185 verticalPanel.add(versionLabel);
186 return verticalPanel;
187 }
188
189 private Widget createVersionHistoryPanel(){
190 VerticalPanel verticalPanel = new VerticalPanel();
191 viewVersion = new Anchor(getLabel(ProgramMsgConstants.SIDEBAR_VIEWHISTORY));
192 viewVersion.addClickHandler(new ClickHandler(){
193 @Override
194 public void onClick(ClickEvent event) {
195 switch (type){
196 case MAJOR: HistoryManager.navigate(AppLocations.Locations.VIEW_PROGRAM_VERSIONS.getLocation()); break;
197 case CORE: HistoryManager.navigate(AppLocations.Locations.VIEW_CORE_VERSIONS.getLocation()); break;
198 case CREDENTIAL: HistoryManager.navigate(AppLocations.Locations.VIEW_BACC_VERSIONS.getLocation()); break;
199 }
200
201
202 }
203
204 });
205
206
207 verticalPanel.add(viewVersion);
208
209 return verticalPanel;
210 }
211
212 public void setState(State state) {
213 this.state = state;
214 buildLayout();
215 }
216
217 private void setStyles() {
218 content.addStyleName("sideBar");
219 content.addStyleName("KS-Program-History-Sidebar");
220 historyLabel.addStyleName("history");
221 }
222
223 public static enum State {
224 EDIT,
225 VIEW
226 }
227
228 public static enum Type {
229 CREDENTIAL,
230 CORE,
231 MAJOR
232 }
233
234 private String getLabel(String messageKey) {
235 return Application.getApplicationContext().getUILabel(ProgramMsgConstants.PROGRAM_MSG_GROUP, messageKey);
236 }
237
238 private String getLabel(String messageKey, String parameter) {
239 Map<String, Object> parameters = new HashMap<String, Object>();
240 parameters.put("0", parameter);
241 return Application.getApplicationContext().getUILabel(ProgramMsgConstants.PROGRAM_MSG_GROUP, messageKey, parameters);
242 }
243 }