Index: test/org/sakaiproject/gradebook/gwt/client/UITest.java
===================================================================
--- test/org/sakaiproject/gradebook/gwt/client/UITest.java (revision 58233)
+++ test/org/sakaiproject/gradebook/gwt/client/UITest.java (working copy)
@@ -81,7 +81,7 @@
//System.out.println("Course grade is " + record.get(StudentModel.Key.COURSE_GRADE.name()));
- multigrade.editCell(record, property, newValue, startValue, ge);
+ multigrade.editCell(null, record, property, newValue, startValue, ge);
Callback c2 = new Callback() {
public void doAction() {
Index: .classpath
===================================================================
--- .classpath (revision 58233)
+++ .classpath (working copy)
@@ -21,7 +21,6 @@
-
@@ -29,5 +28,6 @@
+
Index: client/src/java/org/sakaiproject/gradebook/gwt/sakai/DelegateFacadeImpl.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/sakai/DelegateFacadeImpl.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/sakai/DelegateFacadeImpl.java (working copy)
@@ -75,6 +75,7 @@
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel.CategoryType;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel.GradeType;
import org.sakaiproject.gradebook.gwt.client.model.ItemModel.Type;
+import org.sakaiproject.gradebook.gwt.client.model.StudentModel.Key;
import org.sakaiproject.gradebook.gwt.sakai.model.ActionRecord;
import org.sakaiproject.gradebook.gwt.server.DataTypeConversionUtil;
import org.sakaiproject.section.api.SectionAwareness;
@@ -315,10 +316,12 @@
return null;
}
- public List getEntityTreeModel(
- String gradebookUid, X parent) {
+ public X getEntityTreeModel(String gradebookUid, X parent) {
-
+ Gradebook gradebook = gbService.getGradebook(gradebookUid);
+ List categoriesWithAssignments = getCategoriesWithAssignments(gradebook.getId());
+ return (X)getItemModel(gradebook, categoriesWithAssignments);
+ /*
List items = null;
// For null parent, return all categories
if (parent == null) {
@@ -358,7 +361,7 @@
}
- return items;
+ return items;*/
}
@SuppressWarnings("unchecked")
@@ -1493,18 +1496,41 @@
return new BasePagingLoadResult(rows, startRow, userRecords.size());
}
- private ItemModel getItemModel(List categories) {
+ private ItemModel getItemModel(Gradebook gradebook, List categories) {
- ItemModel gradebookItemModel = new ItemModel();
+ ItemModel gradebookItemModel = createItemModel(gradebook);
gradebookItemModel.setItemType(Type.GRADEBOOK.getName());
+ ItemModel studentInformationModel = new ItemModel();
+ studentInformationModel.setIdentifier(StudentModel.Group.STUDENT_INFORMATION.name());
+ studentInformationModel.setName(StudentModel.Group.STUDENT_INFORMATION.getDisplayName());
+ studentInformationModel.setSource("Static");
+ studentInformationModel.setItemType(Type.CATEGORY.getName());
+ gradebookItemModel.add(studentInformationModel);
+
+ ItemModel displayIdModel = new ItemModel();
+ displayIdModel.setIdentifier(StudentModel.Key.DISPLAY_ID.name());
+ displayIdModel.setName(StudentModel.Key.DISPLAY_ID.getDisplayName());
+ displayIdModel.setStudentModelKey(StudentModel.Key.DISPLAY_ID.name());
+ displayIdModel.setSource("Static");
+ displayIdModel.setItemType(Type.ITEM.getName());
+ studentInformationModel.add(displayIdModel);
+
+ ItemModel displayNameModel = new ItemModel();
+ displayNameModel.setIdentifier(StudentModel.Key.DISPLAY_NAME.name());
+ displayNameModel.setName(StudentModel.Key.DISPLAY_NAME.getDisplayName());
+ displayNameModel.setStudentModelKey(StudentModel.Key.DISPLAY_NAME.name());
+ displayNameModel.setSource("Static");
+ displayNameModel.setItemType(Type.ITEM.getName());
+ studentInformationModel.add(displayNameModel);
+
if (categories != null) {
for(Category category : categories) {
- ItemModel categoryItemModel = new ItemModel();
- categoryItemModel.setIdentifier(String.valueOf(category.getId()));
+ ItemModel categoryItemModel = createItemModel(gradebook, category);
+ /*categoryItemModel.setIdentifier(String.valueOf(category.getId()));
categoryItemModel.setCategoryId(category.getId());
- categoryItemModel.setName(category.getName());
+ categoryItemModel.setName(category.getName());*/
categoryItemModel.setItemType(Type.CATEGORY.getName());
categoryItemModel.setParent(gradebookItemModel);
gradebookItemModel.add(categoryItemModel);
@@ -1513,13 +1539,14 @@
if (assignments != null) {
for(Assignment assignment : assignments) {
- ItemModel assignmentItemModel = new ItemModel();
- assignmentItemModel.setIdentifier(String.valueOf(assignment.getId()));
+ ItemModel assignmentItemModel = createItemModel(category, assignment);
+ /*assignmentItemModel.setIdentifier(String.valueOf(assignment.getId()));
assignmentItemModel.setName(assignment.getName());
assignmentItemModel.setCategoryId(category.getId());
- assignmentItemModel.setCategoryName(category.getName());
+ assignmentItemModel.setCategoryName(category.getName());*/
assignmentItemModel.setItemType(Type.ITEM.getName());
assignmentItemModel.setParent(categoryItemModel);
+ assignmentItemModel.setStudentModelKey(Key.ASSIGNMENT.name());
categoryItemModel.add(assignmentItemModel);
}
@@ -2916,7 +2943,6 @@
model.setRemoved(Boolean.valueOf(category.isRemoved()));
model.setPercentCourseGrade(Double.valueOf(categoryWeight));
-
List assignments = category.getAssignmentList();
if (assignments != null) {
double sum = 0d;
@@ -3017,7 +3043,7 @@
model.setName(gradebook.getName());
List categoriesWithAssignments = getCategoriesWithAssignments(gradebook.getId());
- model.setRootItemModel(getItemModel(categoriesWithAssignments));
+ model.setRootItemModel(getItemModel(gradebook, categoriesWithAssignments));
List columns = getColumns(categoriesWithAssignments);
boolean isUserAbleToGrade = authz.isUserAbleToGrade(gradebookUid);
Index: client/src/java/org/sakaiproject/gradebook/gwt/sakai/GradebookToolFacadeImpl.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/sakai/GradebookToolFacadeImpl.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/sakai/GradebookToolFacadeImpl.java (working copy)
@@ -67,8 +67,7 @@
return delegateFacade.getEntityPage(action, config);
}
- public List getEntityTreeModel(
- String gradebookUid, X parent) {
+ public X getEntityTreeModel(String gradebookUid, X parent) {
return delegateFacade.getEntityTreeModel(gradebookUid, parent);
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/sakai/mock/GradebookToolFacadeMockImpl.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/sakai/mock/GradebookToolFacadeMockImpl.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/sakai/mock/GradebookToolFacadeMockImpl.java (working copy)
@@ -148,8 +148,7 @@
return delegateFacade.getEntityPage(action, config);
}
- public List getEntityTreeModel(
- String gradebookUid, X parent) {
+ public X getEntityTreeModel(String gradebookUid, X parent) {
return delegateFacade.getEntityTreeModel(gradebookUid, parent);
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/I18nConstants.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/I18nConstants.java (revision 0)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/I18nConstants.java (revision 0)
@@ -0,0 +1,82 @@
+/**********************************************************************************
+*
+* $Id:$
+*
+***********************************************************************************
+*
+* Copyright (c) 2008, 2009 The Regents of the University of California
+*
+* Licensed under the
+* Educational Community License, Version 2.0 (the "License"); you may
+* not use this file except in compliance with the License. You may
+* obtain a copy of the License at
+*
+* http://www.osedu.org/licenses/ECL-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an "AS IS"
+* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+* or implied. See the License for the specific language governing
+* permissions and limitations under the License.
+*
+**********************************************************************************/
+package org.sakaiproject.gradebook.gwt.client;
+
+import com.google.gwt.i18n.client.Constants;
+
+public interface I18nConstants extends Constants {
+
+ String categoryName();
+ String itemName();
+
+ String gradeTypePoints();
+ String gradeTypePercentages();
+
+ String orgTypeNoCategories();
+ String orgTypeCategories();
+ String orgTypeWeightedCategories();
+
+ String newMenuHeader();
+ String prefMenuHeader();
+ String prefMenuEnablePopups();
+ String prefMenuGradebookName();
+ String prefMenuOrgTypeHeader();
+ String prefMenuOrgTypeLabel();
+ String prefMenuGradeTypeHeader();
+ String prefMenuReleaseGradesYes();
+ String prefMenuReleaseGradesNo();
+ String viewMenuHeader();
+ String moreMenuHeader();
+
+ String tabGradesHeader();
+ String tabGradeScaleHeader();
+ String tabHistoryHeader();
+
+ String singleViewHeader();
+ String singleGradeHeader();
+
+ String nextLearner();
+ String prevLearner();
+ String viewAsLearner();
+ String close();
+
+ String addCategoryHeading();
+
+ String addItemHeading();
+ String addItemDirections();
+ String addItemName();
+ String addItemPointsEmpty();
+ String addItemPoints();
+ String addItemWeightEmpty();
+ String addItemWeight();
+ String addItemDueDateEmpty();
+ String addItemDueDate();
+ String addItemNoCategoryHeading();
+ String addItemNoCategoryMessage();
+
+ String requiredLabel();
+
+ String changingPointsRecalculatesGrades();
+
+ String unknownException();
+}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookToolFacadeAsync.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookToolFacadeAsync.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookToolFacadeAsync.java (working copy)
@@ -46,7 +46,7 @@
void getEntityPage(PageRequestAction action, PagingLoadConfig config, AsyncCallback> callback);
- void getEntityTreeModel(String gradebookUid, X parent, AsyncCallback> callback);
+ void getEntityTreeModel(String gradebookUid, X parent, AsyncCallback callback);
void recalculateEqualWeightingCategories(String gradebookUid, Long gradebookId, Boolean isEqualWeighting, AsyncCallback> callback);
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/AppConstants.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/AppConstants.java (revision 0)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/AppConstants.java (revision 0)
@@ -0,0 +1,39 @@
+package org.sakaiproject.gradebook.gwt.client;
+
+public interface AppConstants {
+
+ // Registry constants
+ public static final String CURRENT = "current";
+ public static final String ENABLE_POPUPS = "enableNotifications";
+ public static final String I18N = "i18n";
+ public static final String SERVICE = "service";
+
+ // Item type constants
+ public static final String GRADEBOOK = "Gradebook";
+ public static final String CATEGORY = "Category";
+ public static final String ITEM = "Item";
+
+ // Component id constants
+ public static final String ID_ADD_CATEGORY_MENUITEM = "addCategoryMenuItem";
+ public static final String ID_ADD_ITEM_MENUITEM = "addItemMenuItem";
+ public static final String ID_ENABLE_POPUPS_MENUITEM = "enablePopupsMenuItem";
+ public static final String ID_GT_POINTS_MENUITEM = "gradeTypePointsMenuItem";
+ public static final String ID_GT_PERCENTAGES_MENUITEM = "gradeTypePercentagesMenuItem";
+ public static final String ID_RG_YES_MENUITEM = "releaseGradesYesMenuItem";
+ public static final String ID_RG_NO_MENUITEM = "releaseGradesNoMenuItem";
+ public static final String ID_CT_ADD_CATEGORY_MENUITEM = "contextAddCategoryMenuItem";
+ public static final String ID_CT_ADD_ITEM_MENUITEM = "contextAddItemMenuItem";
+
+ // Tab id constants
+ public static final String TAB_GRADES = "tabMultiGrade";
+ public static final String TAB_GRADESCALE = "tabGradeScale";
+ public static final String TAB_HISTORY = "tabHistory";
+
+ public static final String WINDOW_MENU_ITEM_PREFIX = "windowMenuItem:";
+
+ // Tab mode cookie id
+ public static final String TAB_MODE = "tabMode";
+ public static final String COLUMN_PREFIX = "column:";
+ public static final String HIDDEN_SUFFIX = ":hidden";
+ public static final String WIDTH_SUFFIX = ":width";
+}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookToolFacade.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookToolFacade.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookToolFacade.java (working copy)
@@ -58,7 +58,7 @@
PagingLoadResult getEntityPage(PageRequestAction action, PagingLoadConfig config) throws FatalException;
- List getEntityTreeModel(String gradebookUid, X parent);
+ X getEntityTreeModel(String gradebookUid, X parent);
List recalculateEqualWeightingCategories(String gradebookUid, Long gradebookId, Boolean isEqualWeighting);
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/model/GradebookModel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/model/GradebookModel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/model/GradebookModel.java (working copy)
@@ -194,7 +194,6 @@
public void setRootItemModel(ItemModel gradebookItemModel) {
-
this.rootItemModel = new ItemModel();
rootItemModel.setItemType(Type.ROOT.getName());
rootItemModel.setName("Root");
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/model/ItemModel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/model/ItemModel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/model/ItemModel.java (working copy)
@@ -5,8 +5,10 @@
import com.extjs.gxt.ui.client.data.BaseTreeModel;
-public class ItemModel extends BaseTreeModel {
+public class ItemModel extends BaseTreeModel {
+ private static final long serialVersionUID = 1L;
+
public enum Type { ROOT("Root"), GRADEBOOK("Gradebook") , CATEGORY("Category"), ITEM("Item");
private String name;
@@ -25,7 +27,7 @@
INCLUDED("Include in Grade"), REMOVED("Delete"), GRADEBOOK("Gradebook"), DROP_LOWEST("Drop Lowest"),
CATEGORY_NAME("Category"), CATEGORY_ID("Category Id"), DUE_DATE("Due Date"), POINTS("Points"),
RELEASED("Is Released"), SOURCE("Source"), ITEM_TYPE("Type"), PERCENT_COURSE_GRADE("% Grade"),
- PERCENT_CATEGORY("% Category"), IS_PERCENTAGE("Is Percentage");
+ PERCENT_CATEGORY("% Category"), IS_PERCENTAGE("Is Percentage"), STUDENT_MODEL_KEY("Student Model Key");
private String propertyName;
@@ -226,6 +228,14 @@
set(Key.IS_PERCENTAGE.name(), isPercentage);
}
+ public String getStudentModelKey() {
+ return get(Key.STUDENT_MODEL_KEY.name());
+ }
+
+ public void setStudentModelKey(String key) {
+ set(Key.STUDENT_MODEL_KEY.name(), key);
+ }
+
@Override
public boolean equals(Object obj) {
if (obj instanceof ItemModel) {
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookApplication.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookApplication.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/GradebookApplication.java (working copy)
@@ -22,30 +22,24 @@
**********************************************************************************/
package org.sakaiproject.gradebook.gwt.client;
-import java.util.List;
-
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserActionHistory;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityGetAction;
import org.sakaiproject.gradebook.gwt.client.action.Action.EntityType;
import org.sakaiproject.gradebook.gwt.client.gxt.GradebookContainer;
-import org.sakaiproject.gradebook.gwt.client.gxt.GradebookTabItem;
-import org.sakaiproject.gradebook.gwt.client.gxt.TabContainer;
+import org.sakaiproject.gradebook.gwt.client.gxt.controller.AppController;
+import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
import org.sakaiproject.gradebook.gwt.client.model.ApplicationModel;
-import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.Registry;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.util.Theme;
import com.extjs.gxt.ui.client.widget.MessageBox;
-import com.extjs.gxt.ui.client.widget.Viewport;
-import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
-import com.google.gwt.gears.client.database.Database;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
-import com.google.gwt.user.client.ui.RootPanel;
/**
* Entry point classes define onModuleLoad()
.
@@ -54,22 +48,19 @@
private GradebookToolFacadeAsync dataService;
private GradebookContainer gradebookContainer;
- private Viewport viewport;
private int screenHeight = 600;
- private Database db;
public GradebookApplication() {
GXT.setDefaultTheme(Theme.GRAY, true);
}
public void onModuleLoad() {
- viewport = new Viewport();
- viewport.setLayout(new FitLayout());
- viewport.setHeight(screenHeight);
- RootPanel.get().add(viewport);
- GradebookConstants i18n = (GradebookConstants) GWT.create(GradebookConstants.class);
+ final Dispatcher dispatcher = Dispatcher.get();
+ dispatcher.addController(new AppController());
+ I18nConstants i18n = (I18nConstants) GWT.create(I18nConstants.class);
+
if (dataService == null) {
dataService = GWT.create(GradebookToolFacade.class);
EndpointUtil.setEndpoint((ServiceDefTarget) dataService);
@@ -85,9 +76,12 @@
return;
}
+ Registry.register(AppConstants.SERVICE, dataService);
+ Registry.register(AppConstants.I18N, i18n);
+
+ // FIXME: Are we still using these?
Registry.register("history", new UserActionHistory());
- Registry.register("service", dataService);
- Registry.register("i18n", i18n);
+
UserEntityGetAction action =
new UserEntityGetAction(EntityType.APPLICATION);
@@ -95,6 +89,11 @@
RemoteCommand remoteCommand =
new RemoteCommand() {
+ public void onCommandFailure(UserEntityAction action, Throwable caught) {
+
+ dispatcher.dispatch(GradebookEvents.Exception, caught);
+ }
+
public void onCommandSuccess(UserEntityAction action, ApplicationModel model) {
String placementId = model.getPlacementId();
@@ -103,7 +102,7 @@
resizeMainFrame("Main" + modifiedId, screenHeight + 20);
}
- loadGradebooks(screenHeight, model.getGradebookModels());
+ dispatcher.dispatch(GradebookEvents.Startup, model);
}
};
@@ -111,7 +110,7 @@
remoteCommand.execute(action);
}
- protected void loadGradebooks(final int screenHeight, List models) {
+ /*protected void loadGradebooks(final int screenHeight, List models) {
final GradebookToolFacadeAsync service = (GradebookToolFacadeAsync) Registry.get("service");
if (service == null) {
@@ -156,7 +155,7 @@
viewport.add(container);
}
viewport.layout();
- }
+ }*/
// FIXME: This needs to be cleaned up
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/GradebookContainer.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/GradebookContainer.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/GradebookContainer.java (working copy)
@@ -63,8 +63,8 @@
private void renderStudentView(GradebookModel gbModel) {
GradebookToolFacadeAsync service = Registry.get("service");
- studentViewContainer = new StudentViewContainer(gbModel.getGradebookUid(), service, true);
- studentViewContainer.fireEvent(GradebookEvents.SingleView, new IndividualStudentEvent(gbModel.getUserAsStudent()));
+ studentViewContainer = new StudentViewContainer(true);
+ studentViewContainer.fireEvent(GradebookEvents.SingleGrade, new IndividualStudentEvent(gbModel.getUserAsStudent()));
add(studentViewContainer);
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/event/GradebookEvents.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/event/GradebookEvents.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/event/GradebookEvents.java (working copy)
@@ -28,6 +28,21 @@
}
+ public static final int BrowseStudent = 14001;
+ public static final int EditItem = 14002;
+ public static final int EditItemComplete = 14003;
+ public static final int LoadItemTreeModel = 14004;
+ public static final int NewCategory = 14005;
+ public static final int NewItem = 14006;
+ public static final int ShowColumns = 14007;
+ public static final int SingleGrade = 14008;
+ public static final int SingleView = 14009;
+ public static final int Startup = 14010;
+ public static final int SwitchGradebook = 14011;
+
+ public static final int Exception = 14100;
+
+
public static final int EqualWeight = 12000;
public static final int DoSearch = 12001;
@@ -36,12 +51,10 @@
public static final int RefreshCourseGrades = 12003;
- public static final int SingleView = 12004;
+ //public static final int SingleView = 12004;
public static final int GradebookChange = 12005;
- public static final int BrowseStudent = 12006;
-
public static final int UserChange = 12009;
public static final int Refresh = 12010;
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/event/ShowColumnsEvent.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/event/ShowColumnsEvent.java (revision 0)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/event/ShowColumnsEvent.java (revision 0)
@@ -0,0 +1,15 @@
+package org.sakaiproject.gradebook.gwt.client.gxt.event;
+
+import java.util.Set;
+
+public class ShowColumnsEvent {
+
+ public boolean selectAll;
+ public Set selectedItemModelIdSet;
+
+ public ShowColumnsEvent(boolean selectAll, Set selectedItemModelIdSet) {
+ this.selectAll = selectAll;
+ this.selectedItemModelIdSet = selectedItemModelIdSet;
+ }
+
+}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/StudentViewDialog.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/StudentViewDialog.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/StudentViewDialog.java (working copy)
@@ -22,26 +22,24 @@
**********************************************************************************/
package org.sakaiproject.gradebook.gwt.client.gxt;
-import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
+import org.sakaiproject.gradebook.gwt.client.I18nConstants;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityUpdateAction;
import org.sakaiproject.gradebook.gwt.client.gxt.event.BrowseStudentEvent;
import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
-import org.sakaiproject.gradebook.gwt.client.gxt.event.IndividualStudentEvent;
-import org.sakaiproject.gradebook.gwt.client.gxt.event.UserChangeEvent;
import org.sakaiproject.gradebook.gwt.client.gxt.event.BrowseStudentEvent.BrowseType;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
+import org.sakaiproject.gradebook.gwt.client.model.StudentModel;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.Registry;
-import com.extjs.gxt.ui.client.XDOM;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
-import com.extjs.gxt.ui.client.util.Point;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.widget.Dialog;
-import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
@@ -51,31 +49,31 @@
private StudentViewContainer container;
private RefreshAction refreshAction = RefreshAction.NONE;
- private String gradebookUid;
-
- public StudentViewDialog(final String gradebookUid, final GradebookToolFacadeAsync toolSrv) {
- this.gradebookUid = gradebookUid;
-
+
+ public StudentViewDialog(boolean isStudentView) {
setBodyBorder(true);
setButtons(Dialog.OK);
- //setIconStyle("icon-app-side");
- setHeaderVisible(true);
- setHeading("Individual Grade Summary");
- setResizable(false);
- setDraggable(false);
- //setFrame(true);
setCloseAction(CloseAction.CLOSE);
- setHideOnButtonClick(false);
+ setDraggable(true);
+ setHeaderVisible(true);
+ setHideOnButtonClick(false);
setLayout(new FitLayout());
- //setModal(true);
+ setModal(true);
setPlain(false);
+ setResizable(true);
+
+ I18nConstants i18n = Registry.get(AppConstants.I18N);
+ if (isStudentView)
+ setHeading(i18n.singleViewHeader());
+ else
+ setHeading(i18n.singleGradeHeader());
- container = new StudentViewContainer(gradebookUid, toolSrv, false);
+ container = new StudentViewContainer(isStudentView);
add(container);
- setupNavigation();
+ setupNavigation(i18n);
- container.addListener(GradebookEvents.UserChange, new Listener() {
+ /*container.addListener(GradebookEvents.UserChange, new Listener() {
public void handleEvent(UserChangeEvent uce) {
StudentViewDialog.this.fireEvent(GradebookEvents.UserChange, uce);
@@ -95,7 +93,7 @@
be.doit = true;
}
}
- });
+ });*/
addListener(Events.BeforeShow, new Listener() {
@@ -112,34 +110,30 @@
}
});
-
- addListener(GradebookEvents.UserChange, new Listener() {
- public void handleEvent(UserChangeEvent uce) {
- if (uce.getAction() instanceof UserEntityAction) {
- UserChangeEvent event = (UserChangeEvent)uce;
- UserEntityAction action = (UserEntityAction)event.getAction();
-
- // FIXME: Ideally we want to ensure that these methods are only called once at the end of a series of operations
- switch (action.getEntityType()) {
- case GRADEBOOK:
- switch (action.getActionType()) {
- case UPDATE:
- // Update actions will (always?) result from user changes on the setup
- // screens, so they should be deferred to the "onShow" method
- GradebookModel.Key gradebookModelKey = GradebookModel.Key.valueOf(((UserEntityUpdateAction)action).getKey());
- switch (gradebookModelKey) {
- case GRADETYPE:
- queueDeferredRefresh(RefreshAction.REFRESHCOLUMNS);
- break;
- }
- break;
- }
- }
+ }
+
+ public void onChangeModel(GradebookModel selectedGradebook, StudentModel learnerGradeRecordCollection) {
+ container.onChangeModel(selectedGradebook, learnerGradeRecordCollection);
+ }
+
+ public void onUserChange(UserEntityAction> action) {
+ // FIXME: Ideally we want to ensure that these methods are only called once at the end of a series of operations
+ switch (action.getEntityType()) {
+ case GRADEBOOK:
+ switch (action.getActionType()) {
+ case UPDATE:
+ // Update actions will (always?) result from user changes on the setup
+ // screens, so they should be deferred to the "onShow" method
+ GradebookModel.Key gradebookModelKey = GradebookModel.Key.valueOf(((UserEntityUpdateAction)action).getKey());
+ switch (gradebookModelKey) {
+ case GRADETYPE:
+ queueDeferredRefresh(RefreshAction.REFRESHCOLUMNS);
+ break;
}
+ break;
}
-
- });
+ }
}
protected void queueDeferredRefresh(RefreshAction refreshAction) {
@@ -152,59 +146,45 @@
}
}
- private void setupNavigation() {
+ private void setupNavigation(I18nConstants i18n) {
getButtonBar().removeAll();
- Button next = new Button("Next", new SelectionListener() {
+ Button next = new Button(i18n.nextLearner(), new SelectionListener() {
@Override
public void componentSelected(ComponentEvent ce) {
BrowseStudentEvent event = new BrowseStudentEvent(container.getStudentRow(), BrowseType.NEXT);
- StudentViewDialog.this.fireEvent(GradebookEvents.BrowseStudent, event);
- //el().mask(GXT.MESSAGES.loadMask_msg());
+ Dispatcher.forwardEvent(GradebookEvents.BrowseStudent, event);
}
});
- Button prev = new Button("Previous", new SelectionListener() {
+ Button prev = new Button(i18n.prevLearner(), new SelectionListener() {
@Override
public void componentSelected(ComponentEvent ce) {
BrowseStudentEvent event = new BrowseStudentEvent(container.getStudentRow(), BrowseType.PREV);
- StudentViewDialog.this.fireEvent(GradebookEvents.BrowseStudent, event);
- //el().mask(GXT.MESSAGES.loadMask_msg());
+ Dispatcher.forwardEvent(GradebookEvents.BrowseStudent, event);
}
});
- /*Button close = new Button("Close", new SelectionListener() {
+ Button close = new Button(i18n.close(), new SelectionListener() {
@Override
public void componentSelected(ComponentEvent ce) {
close();
-
}
- });*/
+ });
- final GradebookToolFacadeAsync service = Registry.get("service");
- Button studentView = new Button("View as Student", new SelectionListener() {
+ // FIXME: This needs to be integrated into MVC
+ Button studentView = new Button(i18n.viewAsLearner(), new SelectionListener() {
@Override
public void componentSelected(ComponentEvent ce) {
- StudentViewContainer studentView = new StudentViewContainer(gradebookUid, service, true);
- IndividualStudentEvent event = new IndividualStudentEvent(container.getStudentModel());
- studentView.fireEvent(GradebookEvents.SingleView, event);
- Window window = new Window();
- window.setHeading("Student View");
- window.setLayout(new FitLayout());
- window.add(studentView);
-
- Point pos = StudentViewDialog.this.getPosition(false);
- window.setPosition(pos.x, pos.y);
- window.setSize(XDOM.getViewportSize().width, XDOM.getViewportSize().height - pos.y);
-
- window.show();
+ Dispatcher.forwardEvent(GradebookEvents.SingleView, container.getStudentModel());
}
});
- addButton(prev);
addButton(studentView);
+ addButton(prev);
addButton(next);
+ addButton(close);
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/controller/AppController.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/controller/AppController.java (revision 0)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/controller/AppController.java (revision 0)
@@ -0,0 +1,135 @@
+package org.sakaiproject.gradebook.gwt.client.gxt.controller;
+
+import java.util.List;
+
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
+import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
+import org.sakaiproject.gradebook.gwt.client.gxt.view.AppView;
+import org.sakaiproject.gradebook.gwt.client.gxt.view.InstructorView;
+import org.sakaiproject.gradebook.gwt.client.gxt.view.NewItemView;
+import org.sakaiproject.gradebook.gwt.client.gxt.view.SingleGradeView;
+import org.sakaiproject.gradebook.gwt.client.gxt.view.StudentView;
+import org.sakaiproject.gradebook.gwt.client.gxt.view.TreeView;
+import org.sakaiproject.gradebook.gwt.client.model.ApplicationModel;
+import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
+
+import com.extjs.gxt.ui.client.Registry;
+import com.extjs.gxt.ui.client.mvc.AppEvent;
+import com.extjs.gxt.ui.client.mvc.Controller;
+
+public class AppController extends Controller {
+
+ private AppView appView;
+ private NewItemView newItemView;
+ private SingleGradeView singleGrade;
+ private SingleGradeView singleView;
+ private TreeView treeView;
+
+ public AppController() {
+ registerEventTypes(GradebookEvents.BrowseStudent);
+ registerEventTypes(GradebookEvents.EditItem);
+ registerEventTypes(GradebookEvents.EditItemComplete);
+ registerEventTypes(GradebookEvents.LoadItemTreeModel);
+ registerEventTypes(GradebookEvents.NewCategory);
+ registerEventTypes(GradebookEvents.NewItem);
+ registerEventTypes(GradebookEvents.ShowColumns);
+ registerEventTypes(GradebookEvents.SingleGrade);
+ registerEventTypes(GradebookEvents.SingleView);
+ registerEventTypes(GradebookEvents.Startup);
+ registerEventTypes(GradebookEvents.SwitchGradebook);
+ registerEventTypes(GradebookEvents.UserChange);
+ }
+
+ @Override
+ public void handleEvent(AppEvent> event) {
+ // Note: the 'missing' break statements in this switch are intentional, they
+ // allow certain events to drop through to multiple views
+ switch (event.type) {
+ case GradebookEvents.BrowseStudent:
+ onBrowseLearner(event);
+ break;
+ case GradebookEvents.NewCategory:
+ case GradebookEvents.NewItem:
+ onNewItem(event);
+ break;
+ case GradebookEvents.Startup:
+ onStartup(event);
+ break;
+ case GradebookEvents.SingleGrade:
+ onSingleGrade(event);
+ break;
+ case GradebookEvents.SingleView:
+ onSingleView(event);
+ break;
+ case GradebookEvents.SwitchGradebook:
+ case GradebookEvents.UserChange:
+ if (singleGrade != null)
+ forwardToView(singleGrade, event);
+ case GradebookEvents.LoadItemTreeModel:
+ case GradebookEvents.EditItem:
+ case GradebookEvents.EditItemComplete:
+ forwardToView(treeView, event);
+ case GradebookEvents.ShowColumns:
+ forwardToView(appView, event);
+ break;
+ }
+ }
+
+ @Override
+ public void initialize() {
+
+ }
+
+ private void onBrowseLearner(AppEvent> event) {
+ forwardToView(appView, event);
+ }
+
+ private void onNewItem(AppEvent> event) {
+ if (newItemView == null)
+ newItemView = new NewItemView(this);
+
+ forwardToView(newItemView, event);
+ }
+
+ private void onSingleGrade(AppEvent> event) {
+ if (singleGrade == null)
+ singleGrade = new SingleGradeView(this, true);
+
+ forwardToView(singleGrade, event);
+ }
+
+ private void onSingleView(AppEvent> event) {
+ if (singleView == null)
+ singleView = new SingleGradeView(this, false);
+
+ forwardToView(singleView, event);
+ }
+
+ private void onStartup(AppEvent> event) {
+ ApplicationModel model = (ApplicationModel)event.data;
+
+ List gradebookModels = model.getGradebookModels();
+
+ // FIXME: Currently we only evaluate the first gradebook model to determine if we have
+ // FIXME: an instructor or a student. This needs to be refined.
+ for (GradebookModel gbModel : gradebookModels) {
+ Registry.register(gbModel.getGradebookUid(), gbModel);
+ Registry.register(AppConstants.CURRENT, gbModel);
+ boolean isUserAbleToGrade = gbModel.isUserAbleToGrade() == null ? false : gbModel.isUserAbleToGrade().booleanValue();
+ boolean isUserAbleToViewOwnGrades = gbModel.isUserAbleToViewOwnGrades() == null ? false : gbModel.isUserAbleToViewOwnGrades().booleanValue();
+
+ if (isUserAbleToGrade) {
+ this.treeView = new TreeView(this);
+ this.appView = new InstructorView(this, treeView);
+ forwardToView(treeView, event);
+ } else if (isUserAbleToViewOwnGrades) {
+ this.appView = new StudentView(this);
+ }
+
+ forwardToView(appView, event);
+
+ return;
+ }
+ }
+
+}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/GridPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/GridPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/GridPanel.java (working copy)
@@ -22,8 +22,7 @@
**********************************************************************************/
package org.sakaiproject.gradebook.gwt.client.gxt;
-import java.util.List;
-
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.DataTypeConversionUtil;
import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
import org.sakaiproject.gradebook.gwt.client.PersistentStore;
@@ -41,37 +40,26 @@
import org.sakaiproject.gradebook.gwt.client.model.EntityModel;
import org.sakaiproject.gradebook.gwt.client.model.EntityModelComparer;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
-import org.sakaiproject.gradebook.gwt.client.model.ItemModel;
-import org.sakaiproject.gradebook.gwt.client.model.ItemModel.Type;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.Registry;
-import com.extjs.gxt.ui.client.Style.LayoutRegion;
-import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.Style.SortDir;
-import com.extjs.gxt.ui.client.binder.TreeBinder;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
-import com.extjs.gxt.ui.client.data.BaseTreeLoader;
import com.extjs.gxt.ui.client.data.DataReader;
import com.extjs.gxt.ui.client.data.ModelReader;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.data.SortInfo;
-import com.extjs.gxt.ui.client.data.TreeLoader;
-import com.extjs.gxt.ui.client.data.TreeModelReader;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
-import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
-import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Record;
-import com.extjs.gxt.ui.client.store.TreeStore;
-import com.extjs.gxt.ui.client.util.Margins;
-import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Layout;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.CellSelectionModel;
@@ -79,14 +67,10 @@
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridView;
-import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
-import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.CardLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.menu.Menu;
-import com.extjs.gxt.ui.client.widget.tree.Tree;
-import com.extjs.gxt.ui.client.widget.tree.TreeSelectionModel;
import com.google.gwt.i18n.client.NumberFormat;
-import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
public abstract class GridPanel extends ContentPanel {
@@ -99,7 +83,7 @@
protected BasePagingLoader> loader;
protected ListStore store;
- protected String gradebookUid;
+ //protected String gradebookUid;
protected String gridId;
protected PagingToolBar pagingToolBar;
protected EntityType entityType;
@@ -110,16 +94,21 @@
protected PagingLoadConfig loadConfig;
protected int pageSize = 16;
+ protected ContentPanel gridOwner;
+
protected RefreshAction refreshAction = RefreshAction.NONE;
- public GridPanel(String gradebookUid, String gridId, EntityType entityType) {
+ public GridPanel(String gridId, EntityType entityType) {
+ this(gridId, entityType, null);
+ }
+
+ public GridPanel(String gridId, EntityType entityType, ContentPanel childPanel) {
super();
- this.gradebookUid = gradebookUid;
this.gridId = gridId;
this.entityType = entityType;
setHeaderVisible(false);
- setLayout(new FitLayout());
+ setLayout( new FitLayout());
setIconStyle("icon-table");
setMonitorResize(true);
@@ -168,22 +157,55 @@
});
// GRBK-31 : We only add the categories and items tree to multigrade
- if(gridId.equals("multigrade")) {
- add(newLayoutContainer(newGrid(), newTree()));
+ /*if(gridId.equals("multigrade")) {
+ add(newLayoutContainer(newTree()));
}
else {
+ this.gridOwner = this;
add(newGrid());
+ }*/
+ //add(newPanel(childPanel));
+ add(newGrid(childPanel));
+ }
+
+
+ protected FormPanel createForm() {
+ return null;
+ }
+
+ /*
+ * This method will be run whenever the user switches gradebooks, and also on startup
+ */
+ public void onSwitchGradebook(GradebookModel selectedGradebook) {
+ String gradebookUid = selectedGradebook.getGradebookUid();
+ if (store != null) {
+ // Set the default sort field and direction on the store based on Cookies
+ String storedSortField = PersistentStore.getPersistentField(gradebookUid, gridId, "sortField");
+ String storedSortDirection = PersistentStore.getPersistentField(gradebookUid, gridId, "sortDir");
+
+ SortDir sortDir = null;
+ if (storedSortDirection != null) {
+ if (storedSortDirection.equals("Descending"))
+ sortDir = SortDir.DESC;
+ else
+ sortDir = SortDir.ASC;
+ }
+
+ if (storedSortField != null)
+ store.setDefaultSort(storedSortField, sortDir);
}
+ if (loader != null)
+ loader.load(0, pageSize);
}
- protected void onRender(Element parent, int pos) {
+ /*protected void onRender(Element parent, int pos) {
super.onRender(parent, pos);
//add(newGrid());
loader.load(0, pageSize);
- }
+ }*/
- public void editCell(Record record, String property, Object value, Object startValue, GridEvent ge) {
- UserEntityUpdateAction action = newEntityUpdateAction(record, property, value, startValue, ge);
+ public void editCell(GradebookModel selectedGradebook, Record record, String property, Object value, Object startValue, GridEvent ge) {
+ UserEntityUpdateAction action = newEntityUpdateAction(selectedGradebook, record, property, value, startValue, ge);
RemoteCommand remoteCommand = newRemoteCommand(record, property, value, startValue, ge);
@@ -208,7 +230,7 @@
protected abstract CustomColumnModel newColumnModel();
- protected void addComponents() {
+ protected void addComponents(ContentPanel owner) {
// Empty
}
@@ -232,130 +254,31 @@
}
+ protected void initListeners() {
+
+ }
+
protected Menu newContextMenu() {
return null;
}
-
// GRBK-31
- protected LayoutContainer newLayoutContainer(Component center, Component west) {
-
- final LayoutContainer layoutContainer = new LayoutContainer();
-
- final BorderLayout borderLayout = new BorderLayout();
- layoutContainer.setLayout(borderLayout);
-
- BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 150);
- westData.setSplit(true);
- westData.setCollapsible(true);
- westData.setMargins(new Margins(5));
-
- BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
- centerData.setMargins(new Margins(5, 0, 5, 0));
-
- ContentPanel contentPanel = new ContentPanel();
- contentPanel.add(west);
- layoutContainer.add(center, centerData);
- layoutContainer.add(contentPanel, westData);
- return layoutContainer;
+ protected LayoutContainer newPanel(ContentPanel childPanel) {
+ LayoutContainer container = new LayoutContainer();
+ container.setLayout(new FitLayout());
+ container.add(newGrid(this));
+ return container;
}
-
- // GRBK-31
- protected Tree newTree() {
-
- GradebookModel model = Registry.get(gradebookUid);
- ItemModel rootItemModel = model.getRootItemModel();
-
- final Tree tree = new Tree();
- tree.setSelectionModel(new TreeSelectionModel(SelectionMode.MULTI));
+ protected Grid newGrid(ContentPanel owner) {
- TreeLoader treeLoader = new BaseTreeLoader(new TreeModelReader());
- final TreeStore treeStore = new TreeStore(treeLoader);
+ initListeners();
- TreeBinder treeBinder = new TreeBinder(tree, treeStore);
- treeBinder.setDisplayProperty(ItemModel.Key.NAME.name());
- treeBinder.setAutoLoad(true);
- treeBinder.addSelectionChangedListener(new SelectionChangedListener() {
-
- @Override
- public void selectionChanged(SelectionChangedEvent se) {
-
- List allItemModels = treeStore.getAllItems();
- List selectedItemModels = se.getSelection();
-
- // First we hide all the items
- for(ItemModel itemModel : allItemModels) {
-
- if(itemModel.getItemType().equals(Type.ITEM.getName())) {
-
- cm.setHidden(cm.getIndexById(itemModel.getIdentifier()), true);
- }
- }
-
- // Then we show the items that were selected
- for(ItemModel selectedItemModel : selectedItemModels) {
-
- // Check if user selected a gradebook, category, or item
- if(selectedItemModel.getItemType().equals(Type.GRADEBOOK.getName())) {
-
- List categoryItemModels = treeStore.getChildren(selectedItemModel);
-
- for(ItemModel categoryItemModel : categoryItemModels) {
-
- List assignmentItemModels = treeStore.getChildren(categoryItemModel);
-
- for(ItemModel assignmentItemModel : assignmentItemModels) {
-
- cm.setHidden(cm.getIndexById(assignmentItemModel.getIdentifier()), false);
- }
- }
- }
- else if(selectedItemModel.getItemType().equals(Type.CATEGORY.getName())) {
-
- List assignmentItemModels = treeStore.getChildren(selectedItemModel);
-
- for(ItemModel assignmentItemModel : assignmentItemModels) {
-
- cm.setHidden(cm.getIndexById(assignmentItemModel.getIdentifier()), false);
- }
- }
- else if(selectedItemModel.getItemType().equals(Type.ITEM.getName())) {
-
- cm.setHidden(cm.getIndexById(selectedItemModel.getIdentifier()), false);
- }
- }
- }
-
- });
-
- treeLoader.load(rootItemModel);
-
- return tree;
- }
-
-
- protected Grid newGrid() {
-
loader = newLoader();
loader.setRemoteSort(true);
store = newStore(loader);
- String storedSortField = PersistentStore.getPersistentField(gradebookUid, gridId, "sortField");
- String storedSortDirection = PersistentStore.getPersistentField(gradebookUid, gridId, "sortDir");
-
- SortDir sortDir = null;
- if (storedSortDirection != null) {
- if (storedSortDirection.equals("Descending"))
- sortDir = SortDir.DESC;
- else
- sortDir = SortDir.ASC;
- }
-
- if (storedSortField != null)
- store.setDefaultSort(storedSortField, sortDir);
-
loadConfig = newLoadConfig(store, pageSize);
loader.useLoadConfig(loadConfig);
@@ -365,7 +288,7 @@
pagingToolBar = newPagingToolBar(pageSize);
pagingToolBar.bind(loader);
- addComponents();
+ addComponents(owner);
cm = newColumnModel();
grid = new EditorGrid(store, cm);
@@ -382,7 +305,8 @@
// By setting ge.doit to false, we ensure that the AfterEdit event is not thrown. Which means we have to throw it ourselves onSuccess
ge.doit = false;
- editCell(ge.record, ge.property, ge.value, ge.startValue, ge);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ editCell(selectedGradebook, ge.record, ge.property, ge.value, ge.startValue, ge);
}
});
@@ -421,7 +345,8 @@
@Override
protected void load(PagingLoadConfig loadConfig, AsyncCallback> callback) {
GradebookToolFacadeAsync service = Registry.get("service");
- PageRequestAction pageAction = newPageRequestAction();
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ PageRequestAction pageAction = newPageRequestAction(selectedGradebook);
service.getEntityPage(pageAction, loadConfig, callback);
}
@@ -454,9 +379,8 @@
return new BasePagingLoader>(proxy, new ModelReader());
}
- protected PageRequestAction newPageRequestAction() {
- GradebookModel model = Registry.get(gradebookUid);
- return new PageRequestAction(entityType, model.getGradebookUid(), model.getGradebookId());
+ protected PageRequestAction newPageRequestAction(GradebookModel selectedGradebook) {
+ return new PageRequestAction(entityType, selectedGradebook.getGradebookUid(), selectedGradebook.getGradebookId());
}
protected PagingToolBar newPagingToolBar(int pageSize) {
@@ -526,7 +450,7 @@
record.set(property, model.get(property));
}
- protected UserEntityUpdateAction newEntityUpdateAction(final Record record, final String property,
+ protected UserEntityUpdateAction newEntityUpdateAction(GradebookModel selectedGradebook, final Record record, final String property,
final Object value, final Object startValue, final GridEvent gridEvent) {
ColumnConfig config = null;
@@ -557,8 +481,7 @@
}
M model = (M)record.getModel();
- GradebookModel gbModel = Registry.get(gradebookUid);
- UserEntityUpdateAction action = new UserEntityUpdateAction(gbModel, model, property, classType, value, startValue);
+ UserEntityUpdateAction action = new UserEntityUpdateAction(selectedGradebook, model, property, classType, value, startValue);
if (config != null) {
String entityName = new StringBuilder().append(config.getHeader())
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/InstructorViewContainer.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/InstructorViewContainer.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/InstructorViewContainer.java (working copy)
@@ -31,6 +31,7 @@
import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
import org.sakaiproject.gradebook.gwt.client.gxt.event.UserChangeEvent;
import org.sakaiproject.gradebook.gwt.client.gxt.multigrade.MultiGradeContentPanel;
+import org.sakaiproject.gradebook.gwt.client.gxt.multigrade.MultiGradeTreePanel;
import org.sakaiproject.gradebook.gwt.client.gxt.settings.AddAssignmentDialog;
import org.sakaiproject.gradebook.gwt.client.gxt.settings.AddCategoryDialog;
import org.sakaiproject.gradebook.gwt.client.gxt.settings.SettingsAssignmentContentPanel;
@@ -117,19 +118,19 @@
GradebookModel gbModel = Registry.get(gradebookUid);
- multigrade = new MultiGradeContentPanel(gradebookUid, this);
+ multigrade = new MultiGradeContentPanel(new MultiGradeTreePanel());
categoriesPanel = new SettingsCategoryContentPanel(gradebookUid);
assignmentsPanel = new SettingsAssignmentContentPanel(gradebookUid, categoriesPanel);
- gradingScalePanel = new SettingsGradingScaleContentPanel(gradebookUid);
+ gradingScalePanel = new SettingsGradingScaleContentPanel();
- addAssignmentDialog = new AddAssignmentDialog(gbModel.getGradebookUid(), this);
+ addAssignmentDialog = new AddAssignmentDialog();
- addCategoryDialog = new AddCategoryDialog(gradebookUid, this);
+ addCategoryDialog = new AddCategoryDialog();
- historyDialog = new HistoryDialog(gradebookUid);
+ historyDialog = new HistoryDialog();
String storedTabMode = PersistentStore.getPersistentField(gradebookUid, "tabMode", "checked");
if (storedTabMode != null) {
@@ -704,12 +705,7 @@
private void buildSetupWindow() {
settings = new SettingsContentPanel(gradebookUid, multigrade, this);
-
- if (addAssignmentDialog != null)
- addAssignmentDialog.setSettingsPanel(settings);
- if (addCategoryDialog != null)
- addCategoryDialog.setSettingsPanel(settings);
-
+
setupWindow = new Window();
setupWindow.add(settings);
setupWindow.setClosable(false);
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/ItemFormPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/ItemFormPanel.java (revision 0)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/ItemFormPanel.java (revision 0)
@@ -0,0 +1,260 @@
+package org.sakaiproject.gradebook.gwt.client.gxt.multigrade;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
+import org.sakaiproject.gradebook.gwt.client.DataTypeConversionUtil;
+import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
+import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel;
+import org.sakaiproject.gradebook.gwt.client.model.GradebookModel.CategoryType;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel.Type;
+
+import com.extjs.gxt.ui.client.Registry;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Orientation;
+import com.extjs.gxt.ui.client.binder.TreeTableBinder;
+import com.extjs.gxt.ui.client.data.BaseTreeLoader;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.TreeLoader;
+import com.extjs.gxt.ui.client.data.TreeModelReader;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
+import com.extjs.gxt.ui.client.store.Store;
+import com.extjs.gxt.ui.client.store.StoreSorter;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.CheckBox;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.NumberField;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.RowData;
+import com.extjs.gxt.ui.client.widget.layout.RowLayout;
+import com.extjs.gxt.ui.client.widget.table.NumberCellRenderer;
+import com.extjs.gxt.ui.client.widget.tree.TreeItem;
+import com.extjs.gxt.ui.client.widget.treetable.TreeTable;
+import com.extjs.gxt.ui.client.widget.treetable.TreeTableColumn;
+import com.extjs.gxt.ui.client.widget.treetable.TreeTableColumnModel;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.Accessibility;
+
+public class ItemFormPanel extends LayoutContainer {
+
+ private static int CHARACTER_WIDTH = 7;
+
+ private FormPanel formPanel;
+
+ private CheckBox includedField;
+ private CheckBox extraCreditField;
+ private NumberField percentCourseGradeField;
+ private NumberField percentCategoryField;
+ private TreeTable treeTable;
+ private TreeLoader treeLoader;
+ private TreeStore treeStore;
+
+ @SuppressWarnings("unchecked")
+ public ItemFormPanel() {
+ RowLayout layout = new RowLayout();
+ setLayout(layout);
+ layout.setOrientation(Orientation.VERTICAL);
+
+ formPanel = new FormPanel();
+ formPanel.setHeaderVisible(false);
+ //setWidth(400);
+
+ TextField name = new TextField();
+ name.setName(ItemModel.Key.NAME.name());
+ name.setFieldLabel(ItemModel.getPropertyName(ItemModel.Key.NAME));
+ formPanel.add(name);
+
+ includedField = new CheckBox();
+ includedField.setName(ItemModel.Key.INCLUDED.name());
+ includedField.setFieldLabel(ItemModel.getPropertyName(ItemModel.Key.INCLUDED));
+ formPanel.add(includedField);
+
+ percentCourseGradeField = new NumberField();
+ percentCourseGradeField.setName(ItemModel.Key.PERCENT_COURSE_GRADE.name());
+ percentCourseGradeField.setFieldLabel(ItemModel.getPropertyName(ItemModel.Key.PERCENT_COURSE_GRADE));
+ percentCourseGradeField.setFormat(DataTypeConversionUtil.getDefaultNumberFormat());
+ formPanel.add(percentCourseGradeField);
+
+ percentCategoryField = new NumberField();
+ percentCategoryField.setName(ItemModel.Key.PERCENT_CATEGORY.name());
+ percentCategoryField.setFieldLabel(ItemModel.getPropertyName(ItemModel.Key.PERCENT_CATEGORY));
+ percentCategoryField.setFormat(DataTypeConversionUtil.getDefaultNumberFormat());
+ formPanel.add(percentCategoryField);
+
+ extraCreditField = new CheckBox();
+ extraCreditField.setName(ItemModel.Key.EXTRA_CREDIT.name());
+ extraCreditField.setFieldLabel(ItemModel.getPropertyName(ItemModel.Key.EXTRA_CREDIT));
+ formPanel.add(extraCreditField);
+
+ List columns = new ArrayList();
+
+ TreeTableColumn nameColumn = new TreeTableColumn(ItemModel.Key.NAME.name(),
+ ItemModel.getPropertyName(ItemModel.Key.NAME), 180);
+ nameColumn.setSortable(false);
+ columns.add(nameColumn);
+
+ NumberCellRenderer numericCellRenderer = new NumberCellRenderer(DataTypeConversionUtil.getDefaultNumberFormat()) {
+
+ @Override
+ public String render(final TreeItem item, String property, final Object value) {
+ String prefix = "";
+ String result = null;
+ final ItemModel itemModel = (ItemModel)item.getModel();
+ boolean isCategory = itemModel.getItemType().equalsIgnoreCase("Category");
+ boolean isItem = itemModel.getItemType().equalsIgnoreCase("Item");
+ boolean isPercentCategory = property.equals(ItemModel.Key.PERCENT_CATEGORY.name());
+ boolean isPercentGrade = property.equals(ItemModel.Key.PERCENT_COURSE_GRADE.name());
+
+ if (value == null)
+ return null;
+
+ result = super.render(item, property, value);
+
+ StringBuilder cssClasses = new StringBuilder();
+
+ if (!isItem)
+ cssClasses.append("gbCellStrong");
+
+ boolean isExtraCredit = itemModel.getExtraCredit() != null && itemModel.getExtraCredit().booleanValue();
+ if (isExtraCredit) {
+
+ if (isPercentGrade && isCategory) {
+ cssClasses.append(" gbCellExtraCredit");
+ prefix = "+";
+ }
+
+ if (isPercentCategory && isItem) {
+ cssClasses.append(" gbCellExtraCredit");
+ prefix = "+";
+ }
+ }
+
+ return new StringBuilder().append("").append(prefix).append(result).append("").toString();
+ }
+
+ };
+
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
+
+ TreeTableColumn percentCourseGradeColumn = new TreeTableColumn(ItemModel.Key.PERCENT_COURSE_GRADE.name(),
+ ItemModel.getPropertyName(ItemModel.Key.PERCENT_COURSE_GRADE), ItemModel.getPropertyName(ItemModel.Key.PERCENT_COURSE_GRADE).length() * CHARACTER_WIDTH);
+ percentCourseGradeColumn.setAlignment(HorizontalAlignment.RIGHT);
+ percentCourseGradeColumn.setHidden(gbModel.getCategoryType() == CategoryType.SIMPLE_CATEGORIES);
+ percentCourseGradeColumn.setRenderer(numericCellRenderer);
+ percentCourseGradeColumn.setSortable(false);
+ columns.add(percentCourseGradeColumn);
+
+ TreeTableColumn percentCategoryColumn = new TreeTableColumn(ItemModel.Key.PERCENT_CATEGORY.name(),
+ ItemModel.getPropertyName(ItemModel.Key.PERCENT_CATEGORY), ItemModel.getPropertyName(ItemModel.Key.PERCENT_CATEGORY).length() * CHARACTER_WIDTH);
+ percentCategoryColumn.setAlignment(HorizontalAlignment.RIGHT);
+ percentCategoryColumn.setHidden(gbModel.getCategoryType() == CategoryType.SIMPLE_CATEGORIES);
+ percentCategoryColumn.setRenderer(numericCellRenderer);
+ percentCategoryColumn.setSortable(false);
+ columns.add(percentCategoryColumn);
+
+ TreeTableColumnModel treeTableColumnModel = new TreeTableColumnModel(columns);
+ treeTable = new TreeTable(treeTableColumnModel) {
+ @Override
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "treegrid");
+ Accessibility.setState(el().dom, "aria-labelledby", "itemtreelabel");
+ }
+ };
+ treeTable.setAnimate(false);
+ treeTable.getStyle().setLeafIconStyle("icon-page");
+ treeTable.expandAll();
+ treeTable.setHeight(300);
+
+ //add(treeTable);
+
+ treeLoader = new BaseTreeLoader(new TreeModelReader() {
+
+ @Override
+ protected List extends ModelData> getChildren(ModelData parent) {
+ List visibleChildren = new ArrayList();
+ List extends ModelData> children = super.getChildren(parent);
+
+ for (ModelData model : children) {
+ String source = model.get(ItemModel.Key.SOURCE.name());
+ if (source == null || !source.equals("Static"))
+ visibleChildren.add(model);
+ }
+
+ return visibleChildren;
+ }
+ });
+
+ treeStore = new TreeStore(treeLoader);
+ treeStore.setStoreSorter(new StoreSorter() {
+
+ @Override
+ public int compare(Store store, ItemModel m1, ItemModel m2,
+ String property) {
+ boolean m1Category = m1.getItemType().equalsIgnoreCase("Category");
+ boolean m2Category = m2.getItemType().equalsIgnoreCase("Category");
+
+ if (m1Category && !m2Category) {
+ return -1;
+ } else if (!m1Category && m2Category) {
+ return 1;
+ }
+
+ return super.compare(store, m1, m2, property);
+ }
+ });
+
+ TreeTableBinder treeBinder = new TreeTableBinder(treeTable, treeStore);
+ treeBinder.setDisplayProperty(ItemModel.Key.NAME.name());
+
+ formPanel.addButton(new Button("Save", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ Dispatcher.forwardEvent(GradebookEvents.EditItemComplete, Boolean.TRUE);
+ }
+
+ }));
+
+ formPanel.addButton(new Button("Cancel", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ Dispatcher.forwardEvent(GradebookEvents.EditItemComplete, Boolean.FALSE);
+ }
+
+ }));
+
+ add(formPanel, new RowData(1, .5));
+ add(treeTable, new RowData(1, .5));
+ }
+
+ public void onEditItem(ItemModel itemModel) {
+ String itemType = itemModel.get(ItemModel.Key.ITEM_TYPE.name());
+ boolean isNotGradebook = !itemType.equalsIgnoreCase(Type.GRADEBOOK.getName());
+
+ extraCreditField.setVisible(isNotGradebook);
+ includedField.setVisible(isNotGradebook);
+ percentCategoryField.setEnabled(itemType.equalsIgnoreCase(Type.ITEM.getName()));
+ percentCategoryField.setVisible(isNotGradebook);
+ percentCourseGradeField.setEnabled(itemType.equalsIgnoreCase(Type.CATEGORY.getName()));
+
+ treeStore.removeAll();
+ ItemModel rootItemModel = new ItemModel();
+ rootItemModel.setItemType(Type.ROOT.getName());
+ rootItemModel.setName("Root");
+ itemModel.setParent(rootItemModel);
+ rootItemModel.add(itemModel);
+ treeLoader.load(rootItemModel);
+ }
+
+ public FormPanel getFormPanel() {
+ return formPanel;
+ }
+
+}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeContextMenu.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeContextMenu.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeContextMenu.java (working copy)
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.DataTypeConversionUtil;
import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
@@ -83,15 +84,13 @@
private CommentModel commentModel;
- public MultiGradeContextMenu(final String gradebookUid, final StudentModelOwner owner) {
+ public MultiGradeContextMenu(final StudentModelOwner owner) {
super();
contextMenuAddCommentItem = new MenuItem("Add Comment");
contextMenuEditCommentItem = new MenuItem("Edit Comment");
contextMenuViewGradeLogItem = new MenuItem("View Grade History");
- final GradebookModel gbModel = Registry.get(gradebookUid);
-
addCommentTextArea = new TextArea() {
@Override
@@ -108,8 +107,9 @@
commentModel.setAssignmentId(owner.getSelectedAssignment());
commentModel.setText(getValue());
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
UserEntityCreateAction action =
- new UserEntityCreateAction(gbModel, EntityType.COMMENT, commentModel);
+ new UserEntityCreateAction(selectedGradebook, EntityType.COMMENT, commentModel);
RemoteCommand remoteCommand =
new RemoteCommand() {
@@ -158,8 +158,9 @@
case KeyboardListener.KEY_ENTER:
if (commentModel != null) {
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
UserEntityUpdateAction action =
- new UserEntityUpdateAction(gbModel, commentModel,
+ new UserEntityUpdateAction(selectedGradebook, commentModel,
CommentModel.Key.TEXT.name(), ClassType.STRING, getValue(), commentModel.getText());
RemoteCommand remoteCommand =
@@ -294,9 +295,9 @@
if (contextMenuEditCommentItem.isEnabled()) {
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
UserEntityGetAction action =
- new UserEntityGetAction(gbModel, EntityType.COMMENT,
+ new UserEntityGetAction(selectedGradebook, EntityType.COMMENT,
String.valueOf(owner.getSelectedAssignment()), Boolean.TRUE);
action.setStudentUid(owner.getSelectedModel().getIdentifier());
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeContentPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeContentPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeContentPanel.java (working copy)
@@ -25,12 +25,12 @@
import java.util.ArrayList;
import java.util.List;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
+import org.sakaiproject.gradebook.gwt.client.DataTypeConversionUtil;
import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
import org.sakaiproject.gradebook.gwt.client.PersistentStore;
import org.sakaiproject.gradebook.gwt.client.action.PageRequestAction;
-import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
-import org.sakaiproject.gradebook.gwt.client.action.UserEntityGetAction;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityUpdateAction;
import org.sakaiproject.gradebook.gwt.client.action.Action.EntityType;
import org.sakaiproject.gradebook.gwt.client.custom.widget.grid.CustomColumnModel;
@@ -39,11 +39,10 @@
import org.sakaiproject.gradebook.gwt.client.gxt.InstructorViewContainer;
import org.sakaiproject.gradebook.gwt.client.gxt.Notifier;
import org.sakaiproject.gradebook.gwt.client.gxt.StudentViewDialog;
-import org.sakaiproject.gradebook.gwt.client.gxt.ViewEditCommentsDialog;
import org.sakaiproject.gradebook.gwt.client.gxt.event.BrowseStudentEvent;
import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
-import org.sakaiproject.gradebook.gwt.client.gxt.event.IndividualStudentEvent;
import org.sakaiproject.gradebook.gwt.client.gxt.event.RefreshCourseGradesEvent;
+import org.sakaiproject.gradebook.gwt.client.gxt.event.ShowColumnsEvent;
import org.sakaiproject.gradebook.gwt.client.gxt.event.UserChangeEvent;
import org.sakaiproject.gradebook.gwt.client.model.AssignmentModel;
import org.sakaiproject.gradebook.gwt.client.model.CategoryModel;
@@ -51,13 +50,15 @@
import org.sakaiproject.gradebook.gwt.client.model.EntityModelComparer;
import org.sakaiproject.gradebook.gwt.client.model.GradeRecordModel;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel;
import org.sakaiproject.gradebook.gwt.client.model.SectionModel;
import org.sakaiproject.gradebook.gwt.client.model.StudentModel;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel.Type;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.Registry;
-import com.extjs.gxt.ui.client.XDOM;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.SortDir;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.data.ModelData;
@@ -65,6 +66,7 @@
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.KeyListener;
@@ -73,15 +75,19 @@
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.event.ToolBarEvent;
-import com.extjs.gxt.ui.client.event.WindowEvent;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Record;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.store.StoreEvent;
-import com.extjs.gxt.ui.client.util.Point;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.CheckBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.Field;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
@@ -91,6 +97,10 @@
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.grid.GridView;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.CardLayout;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.RowData;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.extjs.gxt.ui.client.widget.menu.Menu;
@@ -108,46 +118,358 @@
public class MultiGradeContentPanel extends GridPanel implements StudentModelOwner {
+ private enum PageOverflow { TOP, BOTTOM, NONE };
+
private static final Notifier notifier = new Notifier();
private StudentViewDialog singleView = null;
private ToolBar searchToolBar;
private LayoutContainer toolBarContainer;
- private InstructorViewContainer instructorViewContainer;
- //private ViewEditCommentsDialog comments;
+ //private LayoutContainer borderLayoutContainer;
+ //private BorderLayoutData westData;
+ //private InstructorViewContainer instructorViewContainer;
private Long commentingAssignmentId;
- private StudentModel commentingStudentModel;
- private List columnDefinitions;
+ private StudentModel commentingStudentModel;
private GridCellRenderer unweightedNumericCellRenderer;
private GridCellRenderer extraCreditNumericCellRenderer;
- //private ToggleToolItem doNotifyItem;
-
private int currentIndex = -1;
private MultiGradeContextMenu contextMenu;
+ //private ContentPanel gridOwner;
+ private TextField searchField;
- public MultiGradeContentPanel(final String gradebookUid, InstructorViewContainer ivContainer) {
- super(gradebookUid, "multigrade", EntityType.STUDENT);
- this.instructorViewContainer = ivContainer;
+ private Listener componentEventListener;
+ private Listener gridEventListener;
+ private Listener refreshCourseGradesListener;
+ private Listener storeListener;
+ private Listener userChangeEventListener;
+
+ private CheckBox includedField;
+ private CheckBox extraCreditField;
+ private NumberField percentCourseGradeField;
+ private NumberField percentCategoryField;
+
+ //protected CardLayout cardLayout;
+ //protected LayoutContainer mainContainer;
+ //protected FormPanel formPanel;
+
+ public MultiGradeContentPanel(ContentPanel childPanel) {
+ super("multigrade", EntityType.STUDENT, childPanel);
setHeaderVisible(false);
+
+ // This UserChangeEvent listener
+ addListener(GradebookEvents.UserChange, userChangeEventListener);
+ addListener(GradebookEvents.RefreshCourseGrades, refreshCourseGradesListener);
+
+ /*singleView.addListener(GradebookEvents.UserChange, new Listener() {
- GradebookModel model = Registry.get(gradebookUid);
+ public void handleEvent(UserChangeEvent uce) {
+ if (uce.getAction() instanceof UserEntityAction) {
+ UserEntityAction action = (UserEntityAction)uce.getAction();
+
+ // FIXME: Ideally we want to ensure that these methods are only called once at the end of a series of operations
+ switch (action.getEntityType()) {
+ case GRADE_RECORD:
+ switch (action.getActionType()) {
+ case UPDATE:
+ UserEntityUpdateAction recordUpdateAction =
+ (UserEntityUpdateAction)action;
+ GradeRecordModel recordModel = recordUpdateAction.getModel();
+ GradeRecordModel.Key recordModelKey = GradeRecordModel.Key.valueOf(recordUpdateAction.getKey());
+
+ StudentModel studentModel = recordUpdateAction.getStudentModel();
+
+ Record r = store.getRecord(studentModel);
+
+ // First, clear out any currently dropped
+ for (String property : studentModel.getPropertyNames()) {
+ if (property.endsWith(StudentModel.DROP_FLAG)) {
+ int dropFlagIndex = property.indexOf(StudentModel.DROP_FLAG);
+
+ String assignmentId = property.substring(0, dropFlagIndex);
+ Object value = studentModel.get(assignmentId);
+ Boolean recordDropped = (Boolean)r.get(property);
+ Boolean modelDropped = studentModel.get(property);
+
+ boolean isDropped = modelDropped != null && modelDropped.booleanValue();
+ boolean wasDropped = recordDropped != null && recordDropped.booleanValue();
+
+ r.set(property, modelDropped);
+
+ if (isDropped || wasDropped) {
+ r.set(assignmentId, null);
+ r.set(assignmentId, value);
+ //r.setDirty(true);
+ }
+ }
+ }
+
+ String courseGrade = studentModel.get(StudentModel.Key.COURSE_GRADE.name());
+
+ if (courseGrade != null) {
+ r.set(StudentModel.Key.COURSE_GRADE.name(), null);
+ r.set(StudentModel.Key.COURSE_GRADE.name(), courseGrade);
+ }
+
+ r.endEdit();
+
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ });*/
+
+ /*final Listener pageListener = new Listener() {
+
+ public void handleEvent(StoreEvent be) {
+ StudentModel freshRow = grid.getStore().getAt(currentIndex);
+ IndividualStudentEvent event = new IndividualStudentEvent(freshRow);
+
+ if (singleView == null)
+ buildSingleView();
+
+ if (singleView.fireEvent(GradebookEvents.SingleView, event)) {
+ Point pos = getInstructorViewContainer().getPosition(false);
+ singleView.setPosition(pos.x, pos.y);
+ singleView.setSize(XDOM.getViewportSize().width, XDOM.getViewportSize().height - 35);
+ singleView.show();
+ //MultiGradeContentPanel.this.hide();
+ }
+ grid.getStore().removeListener(Store.DataChanged, this);
+ }
- final GradebookToolFacadeAsync service = Registry.get("service");
+ };*/
- /* comments = new ViewEditCommentsDialog(model, service, false);
- comments.show();
- comments.hide();
- */
- //singleView = new StudentViewDialog(gradebookUid, service);
+ }
+
+ public StudentModel getSelectedModel() {
+ return commentingStudentModel;
+ }
+
+ public Long getSelectedAssignment() {
+ return commentingAssignmentId;
+ }
+
+ /*
+ * When the user clicks on the next or previous buttons in the student view dialog, an event is thrown to the dispatcher and this
+ * method is eventually called. It must decide whether the next learner in the grid is on the current page or not, and choose whether
+ * to change pages before throwing the event that notifies the dialog box to show a new learner
+ */
+ public void onBrowseLearner(BrowseStudentEvent be) {
+ StudentModel current = be.getStudent();
+ currentIndex = grid.getStore().indexOf(current);
+ PageOverflow pageOverflow = PageOverflow.NONE;
+ // Do processing for paging -- if we reach the end or beginning of a page
+ switch (be.getType()) {
+ case PREV:
+ currentIndex--;
+ if (currentIndex < 0)
+ pageOverflow = PageOverflow.TOP;
+ break;
+ case NEXT:
+ currentIndex++;
+ if (currentIndex >= pageSize || grid.getStore().getAt(currentIndex) == null)
+ pageOverflow = PageOverflow.BOTTOM;
+ break;
+ case CURRENT:
+ break;
+ }
- // This UserChangeEvent listener
- addListener(GradebookEvents.UserChange, new Listener() {
+ boolean requiresPageChange = pageOverflow != PageOverflow.NONE;
+
+ int activePage = pagingToolBar.getActivePage();
+ int numberOfPages = pagingToolBar.getTotalPages();
+
+ switch (pageOverflow) {
+ case TOP:
+ // Go to the last record on the page
+ currentIndex = pageSize - 1;
+ // And we are on the first page, then go to the last page
+ if (activePage == 1)
+ pagingToolBar.last();
+ // Otherwise, go to the one before
+ else
+ pagingToolBar.previous();
+ break;
+ case BOTTOM:
+ currentIndex = 0;
+ // And if we are on the last page
+ if (activePage == numberOfPages) {
+ pagingToolBar.first();
+ } else {
+ pagingToolBar.next();
+ }
+ break;
+ }
+
+ // Any of these cases indicate that we may have gone off the page
+ // (1) a negative index
+ // (2) an index greater than the page size
+ // (3) a null item in the store, in particular on the last page when there are fewer populated rows than the page size allows
+ if (requiresPageChange) {
+ grid.getStore().addListener(Store.DataChanged, new Listener>() {
+ public void handleEvent(StoreEvent se) {
+ StudentModel selectedLearner = null;
+ while (selectedLearner == null && currentIndex >= 0) {
+ selectedLearner = ((ListStore)se.store).getAt(currentIndex);
+ if (selectedLearner != null) {
+ Dispatcher.forwardEvent(GradebookEvents.SingleGrade, selectedLearner);
+ } else {
+ currentIndex--;
+ }
+ }
+ grid.getStore().removeListener(Store.DataChanged, this);
+ }
+
+ });
+ } else {
+ StudentModel selectedLearner = grid.getStore().getAt(currentIndex);
+ Dispatcher.forwardEvent(GradebookEvents.SingleGrade, selectedLearner);
+ }
+ }
+
+ public void onEditMode(Boolean enable) {
+ /*if (enable.booleanValue()) {
+ int size = 500; //XDOM.getViewportSize().width- 10;
+ westData.setMaxSize(size);
+ westData.setSize(size);
+ } else
+ westData.setSize(150);
+ borderLayoutContainer.layout();*/
+ /*if (enable.booleanValue())
+ cardLayout.setActiveItem(formPanel);
+ else
+ cardLayout.setActiveItem(mainContainer);*/
+ }
+
+ @Override
+ public void onSwitchGradebook(GradebookModel selectedGradebook) {
+ super.onSwitchGradebook(selectedGradebook);
+ }
+
+ protected void initListeners() {
+
+ componentEventListener = new Listener() {
+
+ public void handleEvent(ComponentEvent ce) {
+
+ // FIXME: This could be condensed significantly
+ if (ce.type == GradebookEvents.DoSearch) {
+ String searchString = searchField.getValue();
+ String sectionUuid = null;
+ if (loadConfig != null)
+ sectionUuid = ((MultiGradeLoadConfig) loadConfig).getSectionUuid();
+ loadConfig = new MultiGradeLoadConfig();
+ loadConfig.setLimit(0);
+ loadConfig.setOffset(pageSize);
+ ((MultiGradeLoadConfig) loadConfig).setSearchString(searchString);
+ ((MultiGradeLoadConfig) loadConfig).setSectionUuid(sectionUuid);
+ loader.useLoadConfig(loadConfig);
+ loader.load(0, pageSize);
+ } else if (ce.type == GradebookEvents.ClearSearch) {
+ searchField.setValue(null);
+ String sectionUuid = null;
+ if (loadConfig != null)
+ sectionUuid = ((MultiGradeLoadConfig) loadConfig).getSectionUuid();
+ loadConfig = new MultiGradeLoadConfig();
+ loadConfig.setLimit(0);
+ loadConfig.setOffset(pageSize);
+ ((MultiGradeLoadConfig) loadConfig).setSectionUuid(sectionUuid);
+ loader.useLoadConfig(loadConfig);
+ loader.load(0, pageSize);
+ }
+ }
+
+ };
+
+ gridEventListener = new Listener() {
+
+ public void handleEvent(GridEvent ge) {
+
+ switch (ge.type) {
+ case Events.CellClick:
+ if (ge.colIndex == 1 || ge.colIndex == 2) {
+ StudentModel selectedLearner = store.getAt(ge.rowIndex);
+ Dispatcher.forwardEvent(GradebookEvents.SingleGrade, selectedLearner);
+ }
+ break;
+ case Events.ContextMenu:
+ if (ge.rowIndex >= 0 && ge.colIndex >= 0) {
+ ColumnConfig c = grid.getColumnModel().getColumn(ge.colIndex);
+ String assignIdStr = c.getId();
+ long assignId;
+
+ try {
+ assignId = Long.parseLong(assignIdStr);
+ } catch (NumberFormatException e) {
+ ge.doit = false;
+ return;
+ }
+ commentingStudentModel = store.getAt(ge.rowIndex);
+ commentingAssignmentId = new Long(assignId);
+
+ Boolean commentFlag = (Boolean)commentingStudentModel.get(assignId + StudentModel.COMMENTED_FLAG);
+
+ boolean isCommented = commentFlag != null && commentFlag.booleanValue();
+
+ if (isCommented) {
+ contextMenu.enableAddComment(false);
+ contextMenu.enableEditComment(true);
+ } else {
+ contextMenu.enableAddComment(true);
+ contextMenu.enableEditComment(false);
+ }
+
+ Boolean gradedFlag = (Boolean)commentingStudentModel.get(assignId + StudentModel.GRADED_FLAG);
+
+ boolean isGraded = gradedFlag != null && gradedFlag.booleanValue();
+
+ contextMenu.enableViewGradeHistory(isGraded);
+ } else
+ ge.doit = false;
+ break;
+ }
+ }
+ };
+
+ refreshCourseGradesListener = new Listener() {
+
+ public void handleEvent(RefreshCourseGradesEvent rcge) {
+ // These events are fired from the setup screens or the student view dialog/container
+ // so they can be triggered by onShow rather than via an immediate refresh.
+
+ queueDeferredRefresh(RefreshAction.REFRESHDATA);
+ }
+
+ };
+
+
+ storeListener = new Listener() {
+
+ public void handleEvent(StoreEvent se) {
+ String sortField = ((ListStore)se.store).getSortField();
+ SortDir sortDir = ((ListStore)se.store).getSortDir();
+ String sortDirection = sortDir == null || sortDir == SortDir.DESC ? "Descending" : "Ascending";
+
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ String gradebookUid = selectedGradebook.getGradebookUid();
+ PersistentStore.storePersistentField(gradebookUid, gridId, "sortField", sortField);
+ PersistentStore.storePersistentField(gradebookUid, gridId, "sortDir", sortDirection);
+ }
+
+ };
+
+
+ /*userChangeEventListener = new Listener() {
+
public void handleEvent(UserChangeEvent uce) {
// Pass these events on to the single view component
@@ -158,9 +480,11 @@
if (uce.getAction() instanceof UserEntityAction) {
UserEntityAction action = uce.getAction();
+ /--*
if (instructorViewContainer.getHistoryDialog() != null) {
instructorViewContainer.getHistoryDialog().fireEvent(GradebookEvents.UserChange, uce);
}
+ *--/
// FIXME: Ideally we want to ensure that these methods are only called once at the end of a series of operations
switch (action.getEntityType()) {
@@ -259,115 +583,181 @@
}
- });
+ };*/
-
-
- addListener(GradebookEvents.RefreshCourseGrades, new Listener() {
+ /*windowEventListener = new Listener() {
- public void handleEvent(RefreshCourseGradesEvent rcge) {
- // These events are fired from the setup screens or the student view dialog/container
- // so they can be triggered by onShow rather than via an immediate refresh.
-
- queueDeferredRefresh(RefreshAction.REFRESHDATA);
+ public void handleEvent(WindowEvent be) {
+ switch (be.type) {
+ case Events.BeforeShow:
+ MultiGradeContentPanel.this.hide();
+ break;
+ case Events.Close:
+ MultiGradeContentPanel.this.show();
+ break;
+ }
}
- });
+ };*/
+ }
+
+ public void onLoadItemTreeModel(ItemModel root) {
+ cm = assembleColumnModel(root);
+ grid.reconfigure(store, cm);
+ grid.el().unmask();
+ }
+
+ public void onShowColumns(ShowColumnsEvent event) {
+ // Simply loop through and turn them all on
+ for (int i=0;i() {
+ boolean showColumn = event.selectAll || event.selectedItemModelIdSet.contains(column.getId());
+ if (cm.isHidden(i) == showColumn)
+ cm.setHidden(i, !showColumn);
+ }
+ }
+
+ public void onUserChange(UserEntityAction> action) {
+ switch (action.getEntityType()) {
+ case GRADE_ITEM:
+ switch (action.getActionType()) {
+ case CREATE:
+ // We want to do this immediately, since a "Create" action probably comes
+ // from the "Add Assignment" dialog box that may be shown while the multigrade
+ // screen is still visible
+ refreshGrid(RefreshAction.REFRESHCOLUMNS);
+ break;
+ case UPDATE:
+ AssignmentModel.Key assignmentModelKey = AssignmentModel.Key.valueOf(((UserEntityUpdateAction)action).getKey());
+ switch (assignmentModelKey) {
+ // Update actions will (always?) result from user changes on the setup
+ // screens, so they should be deferred to the "onShow" method
+
+ // Name changes mean header needs to update, similarly for delete or include
+ case NAME:
+ case EXTRA_CREDIT:
+ case INCLUDED:
+ case REMOVED:
+ updateColumns(assignmentModelKey, (AssignmentModel)action.getModel());
+ queueDeferredRefresh(RefreshAction.REFRESHLOCALCOLUMNS);
+ break;
+ // Weight changes just mean we need to refresh the screen
+ case WEIGHT:
+ queueDeferredRefresh(RefreshAction.REFRESHDATA);
+ break;
+ case POINTS:
+ Boolean isRecalculated = ((UserEntityUpdateAction)action).getDoRecalculateChildren();
+ if (isRecalculated != null && isRecalculated.booleanValue())
+ queueDeferredRefresh(RefreshAction.REFRESHDATA);
+ break;
- public void handleEvent(UserChangeEvent uce) {
- if (uce.getAction() instanceof UserEntityAction) {
- UserEntityAction action = (UserEntityAction)uce.getAction();
-
- // FIXME: Ideally we want to ensure that these methods are only called once at the end of a series of operations
- switch (action.getEntityType()) {
- case GRADE_RECORD:
- switch (action.getActionType()) {
- case UPDATE:
- UserEntityUpdateAction recordUpdateAction =
- (UserEntityUpdateAction)action;
- GradeRecordModel recordModel = recordUpdateAction.getModel();
- GradeRecordModel.Key recordModelKey = GradeRecordModel.Key.valueOf(recordUpdateAction.getKey());
-
- StudentModel studentModel = recordUpdateAction.getStudentModel();
-
- Record r = store.getRecord(studentModel);
-
- // First, clear out any currently dropped
- for (String property : studentModel.getPropertyNames()) {
- if (property.endsWith(StudentModel.DROP_FLAG)) {
- int dropFlagIndex = property.indexOf(StudentModel.DROP_FLAG);
-
- String assignmentId = property.substring(0, dropFlagIndex);
- Object value = studentModel.get(assignmentId);
- Boolean recordDropped = (Boolean)r.get(property);
- Boolean modelDropped = studentModel.get(property);
-
- boolean isDropped = modelDropped != null && modelDropped.booleanValue();
- boolean wasDropped = recordDropped != null && recordDropped.booleanValue();
-
- r.set(property, modelDropped);
-
- if (isDropped || wasDropped) {
- r.set(assignmentId, null);
- r.set(assignmentId, value);
- //r.setDirty(true);
- }
- }
- }
-
- String courseGrade = studentModel.get(StudentModel.Key.COURSE_GRADE.name());
-
- if (courseGrade != null) {
- r.set(StudentModel.Key.COURSE_GRADE.name(), null);
- r.set(StudentModel.Key.COURSE_GRADE.name(), courseGrade);
- }
-
- r.endEdit();
-
- break;
- }
- break;
- }
}
+ break;
}
- });*/
-
- /*final Listener pageListener = new Listener() {
-
- public void handleEvent(StoreEvent be) {
- StudentModel freshRow = grid.getStore().getAt(currentIndex);
- IndividualStudentEvent event = new IndividualStudentEvent(freshRow);
+ break;
+ case CATEGORY:
+ switch (action.getActionType()) {
+ case CREATE:
- if (singleView == null)
- buildSingleView();
+ break;
+ case UPDATE:
+ // Update actions will (always?) result from user changes on the setup
+ // screens, so they should be deferred to the "onShow" method
+ CategoryModel.Key categoryModelKey = CategoryModel.Key.valueOf(((UserEntityUpdateAction)action).getKey());
+ switch (categoryModelKey) {
+ // Don't need to worry about Category name changes
+ case REMOVED: case INCLUDED: case EXTRA_CREDIT:
+ queueDeferredRefresh(RefreshAction.REFRESHCOLUMNS);
+ break;
+ // Weight changes just mean we need to refresh the screen
+ case WEIGHT: case DROP_LOWEST:
+ queueDeferredRefresh(RefreshAction.REFRESHDATA);
+ break;
+ }
+ break;
+ }
+
+ break;
+ case GRADEBOOK:
+ switch (action.getActionType()) {
+ case UPDATE:
+ // We want to do this immediately, since these actions are now being
+ // fired from the top level menu and multigrade may well be visible.
+ GradebookModel.Key gradebookModelKey = GradebookModel.Key.valueOf(((UserEntityUpdateAction)action).getKey());
+ switch (gradebookModelKey) {
+ case GRADETYPE:
+ refreshGrid(RefreshAction.REFRESHCOLUMNSANDDATA);
+ break;
+ case CATEGORYTYPE:
+ //addCategoryMenuItem.setVisible(((GradebookModel)action.getModel()).getCategoryType() != CategoryType.NO_CATEGORIES);
+ refreshGrid(RefreshAction.REFRESHCOLUMNS);
+ break;
+ }
- if (singleView.fireEvent(GradebookEvents.SingleView, event)) {
- Point pos = getInstructorViewContainer().getPosition(false);
- singleView.setPosition(pos.x, pos.y);
- singleView.setSize(XDOM.getViewportSize().width, XDOM.getViewportSize().height - 35);
- singleView.show();
- //MultiGradeContentPanel.this.hide();
+ break;
+ }
+ break;
+ case GRADE_RECORD:
+ switch (action.getActionType()) {
+ case UPDATE:
+ UserEntityUpdateAction recordUpdateAction =
+ (UserEntityUpdateAction)action;
+ GradeRecordModel recordModel = recordUpdateAction.getModel();
+ GradeRecordModel.Key recordModelKey = GradeRecordModel.Key.valueOf(recordUpdateAction.getKey());
+
+ StudentModel studentModel = recordUpdateAction.getStudentModel();
+
+ Record r = store.getRecord(studentModel);
+
+ // First, clear out any currently dropped
+ for (String property : studentModel.getPropertyNames()) {
+ if (property.endsWith(StudentModel.DROP_FLAG)) {
+ int dropFlagIndex = property.indexOf(StudentModel.DROP_FLAG);
+
+ String assignmentId = property.substring(0, dropFlagIndex);
+ Object value = studentModel.get(assignmentId);
+ Boolean recordDropped = (Boolean)r.get(property);
+ Boolean modelDropped = studentModel.get(property);
+
+ boolean isDropped = modelDropped != null && modelDropped.booleanValue();
+ boolean wasDropped = recordDropped != null && recordDropped.booleanValue();
+
+ r.set(property, modelDropped);
+
+ if (isDropped || wasDropped) {
+ r.set(assignmentId, null);
+ r.set(assignmentId, value);
+ //r.setDirty(true);
+ }
+ }
}
- grid.getStore().removeListener(Store.DataChanged, this);
+
+ String courseGrade = studentModel.get(StudentModel.Key.COURSE_GRADE.name());
+
+ if (courseGrade != null) {
+ r.set(StudentModel.Key.COURSE_GRADE.name(), null);
+ r.set(StudentModel.Key.COURSE_GRADE.name(), courseGrade);
+ }
+
+ r.endEdit();
+
+ break;
}
-
- };*/
-
-
+ break;
+ case GRADE_SCALE:
+ switch (action.getActionType()) {
+ case UPDATE:
+ queueDeferredRefresh(RefreshAction.REFRESHDATA);
+ break;
+ }
+
+ break;
+ }
}
- public StudentModel getSelectedModel() {
- return commentingStudentModel;
- }
-
- public Long getSelectedAssignment() {
- return commentingAssignmentId;
- }
-
-
+
protected void onShowContextMenu(int x, int y) {
super.onShowContextMenu(x, y);
@@ -376,13 +766,14 @@
}
protected CustomColumnModel newColumnModel() {
- GradebookModel model = Registry.get(gradebookUid);
- return assembleColumnModel(model.getColumns());
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ CustomColumnModel columnModel = assembleColumnModel(selectedGradebook.getRootItemModel());
+ return columnModel;
}
@Override
- protected Grid newGrid() {
- Grid grid = super.newGrid();
+ protected Grid newGrid(ContentPanel owner) {
+ Grid grid = super.newGrid(owner);
//grid.setSelectionModel(new MultiGradeCellSelectionModel());
return grid;
}
@@ -390,7 +781,7 @@
@Override
protected GridView newGridView() {
// SAK-2378
- CustomGridView view = new CustomGridView(gradebookUid) {
+ CustomGridView view = new CustomGridView(gridId) {
private Timer showTimer;
private com.google.gwt.dom.client.Element overCell;
@@ -574,11 +965,125 @@
}
protected Menu newContextMenu() {
- contextMenu = new MultiGradeContextMenu(gradebookUid, this);
-
+ contextMenu = new MultiGradeContextMenu(this);
return contextMenu;
}
+ @Override
+ protected LayoutContainer newPanel(ContentPanel childPanel) {
+ /*borderLayoutContainer = new LayoutContainer();
+
+ BorderLayout borderLayout = new BorderLayout();
+ borderLayoutContainer.setLayout(borderLayout);
+
+ westData = new BorderLayoutData(LayoutRegion.WEST, 220);
+ westData.setSplit(true);
+ westData.setCollapsible(true);
+ westData.setMargins(new Margins(5));
+
+ BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
+ centerData.setMargins(new Margins(5, 0, 5, 0));
+
+ gridOwner = new ContentPanel();
+ cardLayout = new CardLayout();
+ gridOwner.setLayout(cardLayout);
+ gridOwner.setHeaderVisible(false);
+
+ newGrid(gridOwner);
+
+ mainContainer = new LayoutContainer();
+ mainContainer.setLayout(new FitLayout());
+ formPanel = createForm();
+
+ mainContainer.add(grid);
+ gridOwner.add(mainContainer);
+ gridOwner.add(formPanel);
+ cardLayout.setActiveItem(mainContainer);
+
+ borderLayoutContainer.add(gridOwner, centerData);
+ borderLayoutContainer.add(childPanel, westData);
+ return borderLayoutContainer;*/
+
+ return null;
+ }
+
+ /*// GRBK-31
+ protected Tree newTree() {
+
+ I18nConstants i18n = Registry.get(AppConstants.I18N);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ ItemModel rootItemModel = selectedGradebook.getRootItemModel();
+
+ final Tree tree = new Tree() {
+
+ @Override
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(getElement(), "tree");
+ }
+
+ };
+ tree.setSelectionModel(new TreeSelectionModel(SelectionMode.MULTI));
+
+ treeLoader = new BaseTreeLoader(new TreeModelReader());
+ treeStore = new TreeStore(treeLoader);
+
+ TreeBinder treeBinder = new TreeBinder(tree, treeStore) {
+
+ @Override
+ protected TreeItem createItem(ItemModel model) {
+ TreeItem item = super.createItem(model);
+ item.addListener(Events.BeforeCollapse, treeEventListener);
+ item.addListener(Events.BeforeExpand, treeEventListener);
+
+ Accessibility.setRole(item.getElement(), "treeitem");
+ return item;
+ }
+
+ };
+ treeBinder.setDisplayProperty(ItemModel.Key.NAME.name());
+ treeBinder.setAutoLoad(true);
+ treeBinder.addSelectionChangedListener(selectionChangedListener);
+
+ treeLoader.load(rootItemModel);
+
+ tree.expandAll();
+
+ treeContextMenu = new Menu();
+ treeContextMenu.setWidth(130);
+
+ addCategoryMenuItem = new MenuItem();
+ addCategoryMenuItem.setText(i18n.addCategoryHeading());
+ addCategoryMenuItem.addSelectionListener(new SelectionListener() {
+ public void componentSelected(MenuEvent ce) {
+ TreeItem item = (TreeItem) tree.getSelectionModel().getSelectedItem();
+ if (item != null) {
+ Dispatcher.forwardEvent(GradebookEvents.NewCategory, item.getModel());
+ }
+ }
+ });
+ treeContextMenu.add(addCategoryMenuItem);
+
+ addCategoryMenuItem.setVisible(selectedGradebook.getCategoryType() != CategoryType.NO_CATEGORIES);
+
+ MenuItem addItemMenuItem = new MenuItem();
+ addItemMenuItem.setText(i18n.addItemHeading());
+ addItemMenuItem.addSelectionListener(new SelectionListener() {
+ public void componentSelected(MenuEvent ce) {
+ TreeItem item = (TreeItem) tree.getSelectionModel().getSelectedItem();
+ if (item != null) {
+ Dispatcher.forwardEvent(GradebookEvents.NewItem, item.getModel());
+ }
+ }
+ });
+ treeContextMenu.add(addItemMenuItem);
+
+ tree.setContextMenu(treeContextMenu);
+
+ return tree;
+ }*/
+
+
/*protected ListStore newStore(BasePagingLoader> loader) {
ListStore store = super.newStore(loader);
@@ -606,7 +1111,7 @@
return store;
}*/
- protected void addComponents() {
+ protected void addComponents(ContentPanel owner) {
unweightedNumericCellRenderer = new UnweightedNumericCellRenderer();
extraCreditNumericCellRenderer = new ExtraCreditNumericCellRenderer();
@@ -614,7 +1119,7 @@
@Override
protected void load(PagingLoadConfig loadConfig, AsyncCallback> callback) {
GradebookToolFacadeAsync service = Registry.get("service");
- GradebookModel model = Registry.get(gradebookUid);
+ GradebookModel model = Registry.get(AppConstants.CURRENT);
PageRequestAction action = new PageRequestAction(EntityType.SECTION, model.getGradebookUid(), model.getGradebookId());
service.getEntityPage(action, loadConfig, callback);
}
@@ -671,7 +1176,7 @@
AdapterToolItem sectionChooserItem = new AdapterToolItem(sectionListBox);
- final TextField searchField = new TextField();
+ searchField = new TextField();
searchField.setEmptyText("Student name");
searchField.setWidth(180);
searchField.addKeyListener(new KeyListener() {
@@ -684,62 +1189,11 @@
}
});
- store.addListener(Store.Sort, new Listener() {
-
- public void handleEvent(StoreEvent se) {
- String sortField = ((ListStore)se.store).getSortField();
- SortDir sortDir = ((ListStore)se.store).getSortDir();
- String sortDirection = sortDir == null || sortDir == SortDir.DESC ? "Descending" : "Ascending";
-
- PersistentStore.storePersistentField(gradebookUid, gridId, "sortField", sortField);
- PersistentStore.storePersistentField(gradebookUid, gridId, "sortDir", sortDirection);
- }
-
- });
+ store.addListener(Store.Sort, storeListener);
- addListener(GradebookEvents.DoSearch, new Listener() {
-
- public void handleEvent(ComponentEvent ce) {
-
- String searchString = searchField.getValue();
-
-
- String sectionUuid = null;
-
- if (loadConfig != null)
- sectionUuid = ((MultiGradeLoadConfig) loadConfig).getSectionUuid();
-
- loadConfig = new MultiGradeLoadConfig();
- loadConfig.setLimit(0);
- loadConfig.setOffset(pageSize);
- ((MultiGradeLoadConfig) loadConfig).setSearchString(searchString);
- ((MultiGradeLoadConfig) loadConfig).setSectionUuid(sectionUuid);
- loader.useLoadConfig(loadConfig);
- loader.load(0, pageSize);
- }
-
- });
+ addListener(GradebookEvents.DoSearch, componentEventListener);
- addListener(GradebookEvents.ClearSearch, new Listener() {
-
- public void handleEvent(ComponentEvent ce) {
-
- searchField.setValue(null);
-
- String sectionUuid = null;
-
- if (loadConfig != null)
- sectionUuid = ((MultiGradeLoadConfig) loadConfig).getSectionUuid();
-
- loadConfig = new MultiGradeLoadConfig();
- loadConfig.setLimit(0);
- loadConfig.setOffset(pageSize);
- ((MultiGradeLoadConfig) loadConfig).setSectionUuid(sectionUuid);
- loader.useLoadConfig(loadConfig);
- loader.load(0, pageSize);
- }
-
- });
+ addListener(GradebookEvents.ClearSearch, componentEventListener);
AdapterToolItem searchFieldItem = new AdapterToolItem(searchField);
@@ -787,131 +1241,8 @@
@Override
protected void addGridListenersAndPlugins(final EditorGrid grid) {
- grid.addListener(Events.CellClick, new Listener() {
-
- public void handleEvent(GridEvent ge) {
- if (ge.colIndex == 1 || ge.colIndex == 2) {
- StudentModel myStudent = store.getAt(ge.rowIndex);
- IndividualStudentEvent e = new IndividualStudentEvent(myStudent);
-
- if (singleView == null)
- buildSingleView();
-
- if (singleView.fireEvent(GradebookEvents.SingleView, e)) {
- int frameHeight = getInstructorViewContainer().getFrameHeight();
- singleView.setPosition(0, frameHeight);
- singleView.setSize(XDOM.getViewportSize().width, XDOM.getViewportSize().height - frameHeight);
- singleView.show();
- }
- }
- }
- });
-
- grid.addListener(Events.ContextMenu, new Listener(){
-
- public void handleEvent(GridEvent be) {
- // FIXME - Can this be done better???
- if (be.rowIndex >= 0 && be.colIndex >= 0)
- {
- ColumnConfig c = grid.getColumnModel().getColumn(
- be.colIndex);
- String assignIdStr = c.getId();
- long assignId;
-
- try {
- assignId = Long.parseLong(assignIdStr);
- } catch (NumberFormatException e) {
- be.doit = false;
- return;
- }
- commentingStudentModel = store.getAt(be.rowIndex);
- commentingAssignmentId = new Long(assignId);
-
- Boolean commentFlag = (Boolean)commentingStudentModel.get(assignId + StudentModel.COMMENTED_FLAG);
-
- boolean isCommented = commentFlag != null && commentFlag.booleanValue();
-
- if (isCommented) {
- contextMenu.enableAddComment(false);
- contextMenu.enableEditComment(true);
- } else {
- contextMenu.enableAddComment(true);
- contextMenu.enableEditComment(false);
- }
-
- Boolean gradedFlag = (Boolean)commentingStudentModel.get(assignId + StudentModel.GRADED_FLAG);
-
- boolean isGraded = gradedFlag != null && gradedFlag.booleanValue();
-
- contextMenu.enableViewGradeHistory(isGraded);
-
-
- int windowWidth = 0;
- int windowHeight = 0;
- int cellLeft = 0;
- int cellWidth = 0;
-
- int cellTop = 0;
- int cellHeight = 0;
-
- int bestX = 0;
- int bestY = 0;
-
- int commentsWidth;
- int commentsHeight;
-
- /* if (comments != null)
- {
- commentsHeight = comments.getOffsetHeight();
- commentsWidth = comments.getOffsetWidth();
- }
- else
- {
- commentsWidth = 0;
- commentsHeight = 0;
- }
- windowWidth = XDOM.getViewportSize().width;
- windowHeight = XDOM.getViewportSize().height - getInstructorViewContainer().getFrameHeight();
-
- cellLeft = grid.getView().getCell(be.rowIndex, be.colIndex).getAbsoluteLeft();
- cellWidth = grid.getView().getCell(be.rowIndex, be.colIndex).getOffsetWidth();
-
- cellTop = grid.getView().getCell(be.rowIndex, be.colIndex).getAbsoluteTop();
- cellHeight = grid.getView().getCell(be.rowIndex, be.colIndex).getOffsetHeight();
-
- bestX = cellLeft + cellWidth;
- bestY = cellTop + cellHeight;
-
- if ( (bestX + commentsWidth) > windowWidth )
- {
- bestX = cellLeft - commentsWidth;
- if (bestX < 0)
- {
- // In this case we'll overlap our cell, but that should be ok
- bestX = 0;
- }
- }
-
- if ( (bestY + commentsHeight) > windowHeight)
- {
- bestY = cellTop - commentsHeight;
- if (bestY < 0)
- {
- // In this case we'll overlap our cell, but that should be ok
- bestY = 0;
- }
- }
- */
- }
-
-
- else
- {
- be.doit = false;
- }
- }
-
- });
+ grid.addListener(Events.CellClick, gridEventListener);
+ grid.addListener(Events.ContextMenu, gridEventListener);
}
// TODO: This can probably be removed
@@ -944,13 +1275,23 @@
public void onResize(int x, int y) {
super.onResize(x, y);
- if (singleView != null) {
+ /*if (singleView != null) {
int frameHeight = getInstructorViewContainer().getFrameHeight();
singleView.setPosition(0, frameHeight);
singleView.setSize(XDOM.getViewportSize().width, XDOM.getViewportSize().height - frameHeight);
- }
+ }*/
- toolBarContainer.setWidth(getWidth());
+ //if (gridOwner != null) {
+
+ if (isRendered())
+ toolBarContainer.setWidth(getWidth());
+
+ /*if (singleView != null) {
+ singleView.setPosition(gridOwner.getAbsoluteLeft(), gridOwner.getAbsoluteTop());
+ singleView.setSize(gridOwner.getWidth(), gridOwner.getHeight());
+ }*/
+
+ //}
}
@@ -975,8 +1316,137 @@
}*/
}
+ private boolean lookupDefaultIsHidden(String gradebookUid, String identifier) {
+ String storedHidden = PersistentStore.getPersistentField(gradebookUid, gridId, new StringBuilder()
+ .append(AppConstants.COLUMN_PREFIX).append(identifier).append(AppConstants.HIDDEN_SUFFIX).toString());
+ boolean isHidden = false;
+ if (storedHidden != null) {
+ isHidden = Boolean.valueOf(storedHidden).booleanValue();
+ }
+ return isHidden;
+ }
- private CustomColumnModel assembleColumnModel(List columns) {
+ private int lookupDefaultColumnWidth(String gradebookUid, String identifier, String name) {
+ String storedWidth = PersistentStore.getPersistentField(gradebookUid, gridId, new StringBuilder()
+ .append(AppConstants.COLUMN_PREFIX).append(identifier).append(AppConstants.WIDTH_SUFFIX).toString());
+ int columnWidth = 200;
+
+ if (storedWidth != null) {
+ columnWidth = Integer.parseInt(storedWidth);
+ } else {
+ // Otherwise calculate the column width based on the length of the name
+ if (identifier.equals(StudentModel.Key.DISPLAY_ID.name()))
+ columnWidth = 100;
+ else if (name != null)
+ columnWidth = name.length() * 10 + 20;
+ }
+ return columnWidth;
+ }
+
+ private ColumnConfig buildColumn(GradebookModel selectedGradebook, ItemModel item) {
+
+ int columnWidth = lookupDefaultColumnWidth(selectedGradebook.getGradebookUid(), item.getIdentifier(), item.getName());
+ boolean isHidden = lookupDefaultIsHidden(selectedGradebook.getGradebookUid(), item.getIdentifier());
+
+ ColumnConfig config = new ColumnConfig(item.getIdentifier(), item.getName(), columnWidth);
+
+ config.setHidden(isHidden);
+
+ Field> field = null;
+ StudentModel.Key key = StudentModel.Key.valueOf(item.getStudentModelKey());
+ boolean isIncluded = item.getIncluded() != null && item.getIncluded().booleanValue();
+ boolean isExtraCredit = item.getExtraCredit() != null && item.getExtraCredit().booleanValue();
+ switch (key) {
+ case ASSIGNMENT:
+ switch (selectedGradebook.getGradeType()) {
+ case POINTS:
+ case PERCENTAGES:
+ config.setAlignment(HorizontalAlignment.RIGHT);
+ config.setNumberFormat(defaultNumberFormat);
+
+ NumberField numberField = new NumberField();
+ numberField.setFormat(defaultNumberFormat);
+ numberField.setPropertyEditorType(Double.class);
+ //numberField.setMaxValue(column.getMaxPoints());
+ numberField.setSelectOnFocus(true);
+ numberField.addInputStyleName("gbNumericFieldInput");
+ field = numberField;
+
+ if (!isIncluded)
+ config.setRenderer(unweightedNumericCellRenderer);
+ else if (isExtraCredit)
+ config.setRenderer(extraCreditNumericCellRenderer);
+
+ break;
+ case LETTERS:
+ TextField textField = new TextField();
+ textField.setSelectOnFocus(true);
+ textField.addInputStyleName("gbTextFieldInput");
+ field = textField;
+
+ if (!isIncluded)
+ config.setRenderer(unweightedTextCellRenderer);
+ else if (isExtraCredit)
+ config.setRenderer(extraCreditTextCellRenderer);
+
+ break;
+ }
+
+ break;
+ case COURSE_GRADE:
+
+ break;
+ case GRADE_OVERRIDE:
+ TextField textField = new TextField();
+ textField.addInputStyleName("gbTextFieldInput");
+ textField.setSelectOnFocus(true);
+ field = textField;
+
+ if (!isIncluded)
+ config.setRenderer(unweightedTextCellRenderer);
+
+ break;
+ }
+
+ boolean isEditable = item.getSource() == null; //column.isEditable() != null && column.isEditable().booleanValue();
+ if (field != null && isEditable) {
+ final CellEditor editor = new CellEditor(field);
+ editor.setCompleteOnEnter(true);
+ editor.setCancelOnEsc(true);
+ config.setEditor(editor);
+ }
+
+ return config;
+ }
+
+ // FIXME: When changing gradebooks we will need to re-assemble the column model
+ private CustomColumnModel assembleColumnModel(ItemModel rootItemModel) {
+
+ List configs = new ArrayList();
+ int i = 0;
+
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ for (ItemModel gradebook : rootItemModel.getChildren()) {
+ for (ItemModel child : gradebook.getChildren()) {
+
+ if (child.getItemType().equals(Type.CATEGORY.getName())) {
+
+ for (ItemModel item : child.getChildren()) {
+ configs.add(buildColumn(selectedGradebook, item));
+ }
+
+ } else {
+ configs.add(buildColumn(selectedGradebook, child));
+ }
+ }
+ }
+
+ CustomColumnModel cm = new CustomColumnModel(selectedGradebook.getGradebookUid(), gridId, configs);
+
+ return cm;
+ }
+
+ /*private CustomColumnModel assembleColumnModel(List columns) {
this.columnDefinitions = columns;
GradebookModel gbModel = Registry.get(gradebookUid);
@@ -1075,27 +1545,15 @@
CustomColumnModel cm = new CustomColumnModel(gradebookUid, gridId, configs);
return cm;
- }
+ }*/
- private void buildSingleView() {
+ /*private void buildSingleView() {
GradebookToolFacadeAsync service = Registry.get("service");
- singleView = new StudentViewDialog(gradebookUid, service);
+ singleView = new StudentViewDialog();
- singleView.addListener(Events.BeforeShow, new Listener() {
-
- public void handleEvent(WindowEvent be) {
- MultiGradeContentPanel.this.hide();
- }
-
- });
+ //singleView.addListener(Events.BeforeShow, windowEventListener);
- singleView.addListener(Events.Close, new Listener() {
-
- public void handleEvent(WindowEvent be) {
- MultiGradeContentPanel.this.show();
- }
-
- });
+ //singleView.addListener(Events.Close, windowEventListener);
singleView.addListener(GradebookEvents.BrowseStudent, new Listener() {
@@ -1128,9 +1586,14 @@
IndividualStudentEvent event = new IndividualStudentEvent(freshRow);
if (singleView.fireEvent(GradebookEvents.SingleView, event)) {
- Point pos = getInstructorViewContainer().getPosition(false);
+
+ /--*Point pos = getInstructorViewContainer().getPosition(false);
singleView.setPosition(pos.x, pos.y);
singleView.setSize(XDOM.getViewportSize().width, XDOM.getViewportSize().height - 35);
+ *--/
+
+ singleView.setPosition(gridOwner.getAbsoluteLeft(), gridOwner.getAbsoluteTop());
+ singleView.setSize(gridOwner.getWidth(), gridOwner.getHeight());
singleView.show();
//MultiGradeContentPanel.this.hide();
}
@@ -1230,7 +1693,7 @@
}
});
- }
+ }*/
@Override
protected void refreshGrid(RefreshAction refreshAction) {
@@ -1248,7 +1711,25 @@
final Boolean refreshData = Boolean.valueOf(includeData);
- GradebookModel gbModel = Registry.get(gradebookUid);
+
+ GradebookToolFacadeAsync service = Registry.get(AppConstants.SERVICE);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+
+ service.getEntityTreeModel(selectedGradebook.getGradebookUid(), null, new AsyncCallback() {
+
+ public void onFailure(Throwable caught) {
+ Dispatcher.forwardEvent(GradebookEvents.Exception, caught);
+ }
+
+ public void onSuccess(ItemModel result) {
+ Dispatcher.forwardEvent(GradebookEvents.LoadItemTreeModel, result);
+ if (refreshData.equals(Boolean.TRUE))
+ pagingToolBar.refresh();
+ }
+
+ });
+
+ /*GradebookModel gbModel = Registry.get(gradebookUid);
UserEntityGetAction action =
new UserEntityGetAction(gbModel, EntityType.COLUMN);
@@ -1268,7 +1749,7 @@
}
};
- remoteCommand.executeList(action);
+ remoteCommand.executeList(action);*/
}
private void doRefresh(String property, Record record, StudentModel model, StudentModel startModel) {
@@ -1291,11 +1772,19 @@
@Override
protected void beforeUpdateView(UserEntityAction action, Record record, StudentModel model) {
- for (ColumnModel columnDefinition : columnDefinitions) {
+ // FIXME: Is this going to be satisfactory?
+ for (int i=0;i unweightedTextCellRenderer = new GridCellRenderer() {
@@ -1353,14 +1842,14 @@
}
};
- private void reconfigureGrid(String gradebookUid, List columns) {
- cm = assembleColumnModel(columns);
+ /*private void reconfigureGrid(String gradebookUid, ItemModel rootItemModel) {
+ cm = assembleColumnModel(rootItemModel);
grid.reconfigure(store, cm);
grid.el().unmask();
- }
+ }*/
private void updateColumns(AssignmentModel.Key key, AssignmentModel model) {
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
ColumnModel removeColumn = null;
List columns = gbModel.getColumns();
if (columns != null) {
@@ -1394,7 +1883,4 @@
gbModel.setColumns(columns);
}
- public InstructorViewContainer getInstructorViewContainer() {
- return instructorViewContainer;
- }
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeTreePanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeTreePanel.java (revision 0)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/multigrade/MultiGradeTreePanel.java (revision 0)
@@ -0,0 +1,609 @@
+package org.sakaiproject.gradebook.gwt.client.gxt.multigrade;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
+import org.sakaiproject.gradebook.gwt.client.DataTypeConversionUtil;
+import org.sakaiproject.gradebook.gwt.client.I18nConstants;
+import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
+import org.sakaiproject.gradebook.gwt.client.action.UserEntityUpdateAction;
+import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
+import org.sakaiproject.gradebook.gwt.client.gxt.event.ShowColumnsEvent;
+import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel;
+import org.sakaiproject.gradebook.gwt.client.model.StudentModel;
+import org.sakaiproject.gradebook.gwt.client.model.GradebookModel.CategoryType;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel.Type;
+
+import com.extjs.gxt.ui.client.Events;
+import com.extjs.gxt.ui.client.Registry;
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Orientation;
+import com.extjs.gxt.ui.client.binder.TreeTableBinder;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.dnd.TreeDragSource;
+import com.extjs.gxt.ui.client.dnd.TreeDropTarget;
+import com.extjs.gxt.ui.client.dnd.DND.Feedback;
+import com.extjs.gxt.ui.client.event.DNDEvent;
+import com.extjs.gxt.ui.client.event.DNDListener;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.MenuEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.event.TreeEvent;
+import com.extjs.gxt.ui.client.event.TreeTableEvent;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.form.CheckBox;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.NumberField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.RowData;
+import com.extjs.gxt.ui.client.widget.layout.RowLayout;
+import com.extjs.gxt.ui.client.widget.menu.Menu;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
+import com.extjs.gxt.ui.client.widget.table.NumberCellRenderer;
+import com.extjs.gxt.ui.client.widget.tree.TreeItem;
+import com.extjs.gxt.ui.client.widget.treetable.TreeTable;
+import com.extjs.gxt.ui.client.widget.treetable.TreeTableColumn;
+import com.extjs.gxt.ui.client.widget.treetable.TreeTableColumnModel;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.Accessibility;
+
+public class MultiGradeTreePanel extends ContentPanel {
+
+ //private TreeLoader treeLoader;
+ //private TreeStore treeStore;
+
+ private Menu treeContextMenu;
+ private MenuItem addCategoryMenuItem;
+
+ private SelectionListener menuSelectionListener;
+ private SelectionChangedListener selectionChangedListener;
+ private Listener treeEventListener;
+ private Listener treeTableEventListener;
+
+ private ContentPanel editPanel;
+ private TreeTable treeTable;
+ private TreeTableColumn percentCourseGradeColumn;
+ private TreeTableColumn percentCategoryColumn;
+ private TreeTableColumnModel treeTableColumnModel;
+
+
+ private boolean isEditMode;
+
+ public MultiGradeTreePanel() {
+ this.isEditMode = false;
+
+ setHeading("Items");
+ setLayout(new FitLayout());
+ initListeners();
+
+ /*ToolBar treeToolbar = new ToolBar();
+ TextToolItem doEdit = new TextToolItem("Edit", new SelectionListener() {
+
+ @Override
+ public void componentSelected(ToolBarEvent tbe) {
+ TextToolItem doEditItem = (TextToolItem)tbe.item;
+ if (!isEditMode)
+ doEditItem.setText("View");
+ else
+ doEditItem.setText("Edit");
+
+ Dispatcher.forwardEvent(GradebookEvents.EditMode, Boolean.valueOf(!isEditMode));
+ }
+
+ });
+ treeToolbar.add(doEdit);*/
+
+ setHeading("Items");
+ //setTopComponent(treeToolbar);
+ //navigationTree = newNavigationTree();
+ //add(navigationTree);
+ editPanel = newEditTree();
+ add(editPanel);
+ }
+
+ public void onTreeStoreInitialized(TreeStore treeStore) {
+ TreeTableBinder treeBinder = new TreeTableBinder(treeTable, treeStore) /* {
+
+ @Override
+ protected TreeItem createItem(ItemModel model) {
+ TreeItem item = super.createItem(model);
+ item.addListener(Events.BeforeCollapse, treeEventListener);
+ item.addListener(Events.BeforeExpand, treeEventListener);
+
+ Accessibility.setRole(item.getElement(), "treeitem");
+ return item;
+ }
+
+ }*/;
+ treeBinder.setDisplayProperty(ItemModel.Key.NAME.name());
+ //treeBinder.setAutoLoad(true);
+ treeBinder.addSelectionChangedListener(selectionChangedListener);
+
+ TreeDragSource source = new TreeDragSource(treeBinder);
+ source.addDNDListener(new DNDListener() {
+ @Override
+ public void dragStart(DNDEvent e) {
+ TreeItem item = treeTable.findItem(e.getTarget());
+ if (item != null && item == treeTable.getRootItem().getItem(0)
+ && treeTable.getRootItem().getItemCount() == 1) {
+ e.doit = false;
+ e.status.setStatus(false);
+ return;
+ }
+ super.dragStart(e);
+ }
+ });
+
+ TreeDropTarget target = new TreeDropTarget(treeBinder);
+ target.setAllowSelfAsSource(true);
+ target.setFeedback(Feedback.BOTH);
+ }
+
+ /*public void onLoadItemTreeModel(ItemModel root) {
+ treeStore.removeAll();
+ ItemModel rootItemModel = new ItemModel();
+ rootItemModel.setItemType(Type.ROOT.getName());
+ rootItemModel.setName("Root");
+ root.setParent(rootItemModel);
+ rootItemModel.add(root);
+ treeLoader.load(rootItemModel);
+ }*/
+
+ public void onSwitchGradebook(GradebookModel selectedGradebook) {
+ addCategoryMenuItem.setVisible(selectedGradebook.getCategoryType() != CategoryType.NO_CATEGORIES);
+ }
+
+ public void onUserChange(UserEntityAction> action) {
+ switch (action.getEntityType()) {
+ case GRADEBOOK:
+ switch (action.getActionType()) {
+ case UPDATE:
+ // We want to do this immediately, since these actions are now being
+ // fired from the top level menu and multigrade may well be visible.
+ GradebookModel.Key gradebookModelKey = GradebookModel.Key.valueOf(((UserEntityUpdateAction)action).getKey());
+ switch (gradebookModelKey) {
+ case CATEGORYTYPE:
+ addCategoryMenuItem.setVisible(((GradebookModel)action.getModel()).getCategoryType() != CategoryType.NO_CATEGORIES);
+ break;
+ }
+
+ break;
+ }
+ break;
+
+ }
+ }
+
+ private static int CHARACTER_WIDTH = 7;
+
+ @SuppressWarnings("unchecked")
+ protected ContentPanel newEditTree() {
+ List columns = new ArrayList();
+
+ TreeTableColumn nameColumn = new TreeTableColumn(ItemModel.Key.NAME.name(),
+ ItemModel.getPropertyName(ItemModel.Key.NAME), 180);
+ nameColumn.setSortable(false);
+ columns.add(nameColumn);
+
+ //CheckBoxCellRenderer checkBoxCellRenderer = new CheckBoxCellRenderer();
+
+ /*TreeTableColumn includedColumn = new TreeTableColumn(ItemModel.Key.INCLUDED.name(),
+ ItemModel.getPropertyName(ItemModel.Key.INCLUDED), ItemModel.getPropertyName(ItemModel.Key.INCLUDED).length() * CHARACTER_WIDTH);
+ includedColumn.setRenderer(checkBoxCellRenderer);
+
+
+ includedColumn.setSortable(false);
+ columns.add(includedColumn);*/
+
+ NumberCellRenderer numericCellRenderer = new NumberCellRenderer(DataTypeConversionUtil.getDefaultNumberFormat()) {
+
+ @Override
+ public String render(final TreeItem item, String property, final Object value) {
+ String prefix = "";
+ String result = null;
+ final ItemModel itemModel = (ItemModel)item.getModel();
+ boolean isCategory = itemModel.getItemType().equalsIgnoreCase("Category");
+ boolean isItem = itemModel.getItemType().equalsIgnoreCase("Item");
+ boolean isPercentCategory = property.equals(ItemModel.Key.PERCENT_CATEGORY.name());
+ boolean isPercentGrade = property.equals(ItemModel.Key.PERCENT_COURSE_GRADE.name());
+
+ // The percent category field for category rows is a special summary row
+ if (isCategory && isPercentCategory) {
+
+ /*loader.addLoadListener(new LoadListener() {
+
+ @Override
+ public void loaderLoad(LoadEvent le) {
+ TreeLoadEvent tle = (TreeLoadEvent)le;
+
+ ItemModel parent = (ItemModel)tle.parent;
+
+ double sum = 0d;
+ for (ItemModel childModel : tle.data) {
+ sum += childModel.getPercentCategory() == null ? 0d : childModel.getPercentCategory().doubleValue();
+ }
+ System.out.println("SUM: " + sum);
+ //parent.setPercentCategory(Double.valueOf(sum));
+ loader.removeLoadListener(this);
+ }
+
+ });*/
+
+ //loader.loadChildren(itemModel);
+
+ /*
+ item.addListener(Events.Expand, new Listener() {
+
+ public void handleEvent(TreeEvent be) {
+ List children = store.getChildren(itemModel);
+
+ if (children != null && !children.isEmpty()) {
+ double sum = 0d;
+ for (ItemModel childModel : children) {
+ sum += childModel.getPercentCategory() == null ? 0d : childModel.getPercentCategory().doubleValue();
+ }
+ itemModel.setPercentCategory(Double.valueOf(sum));
+ item.removeListener(Events.Expand, this);
+ }
+ }
+
+ });*/
+ }
+
+ /*if (isItem && property.equals(ItemModel.Key.PERCENT_CATEGORY.name())) {
+
+ ItemModel parent = (ItemModel)item.getParentItem().getModel();
+ double sumParent = parent.getPercentCategory() == null ? 0d : parent.getPercentCategory().doubleValue();
+ double v = value == null ? 0d : ((Double)value).doubleValue();
+
+ parent.setPercentCategory(Double.valueOf(sumParent + v));
+
+ /--*List children = item.getItems();
+ if (children != null && !children.isEmpty()) {
+ double sum = 0d;
+ for (TreeItem child : children) {
+ ItemModel childModel = (ItemModel)child.getModel();
+ sum += childModel.getPercentCategory() == null ? 0d : childModel.getPercentCategory().doubleValue();
+ }
+ value = Double.valueOf(sum);
+ }*--/
+ }*/
+
+ if (value == null)
+ return null;
+
+ result = super.render(item, property, value);
+
+ StringBuilder cssClasses = new StringBuilder();
+
+ if (!isItem)
+ cssClasses.append("gbCellStrong");
+
+ boolean isExtraCredit = itemModel.getExtraCredit() != null && itemModel.getExtraCredit().booleanValue();
+ if (isExtraCredit) {
+
+ if (isPercentGrade && isCategory) {
+ cssClasses.append(" gbCellExtraCredit");
+ prefix = "+";
+ }
+
+ if (isPercentCategory && isItem) {
+ cssClasses.append(" gbCellExtraCredit");
+ prefix = "+";
+ }
+ }
+
+ return new StringBuilder().append("").append(prefix).append(result).append("").toString();
+ }
+
+ };
+
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
+
+ percentCourseGradeColumn = new TreeTableColumn(ItemModel.Key.PERCENT_COURSE_GRADE.name(),
+ ItemModel.getPropertyName(ItemModel.Key.PERCENT_COURSE_GRADE), ItemModel.getPropertyName(ItemModel.Key.PERCENT_COURSE_GRADE).length() * CHARACTER_WIDTH);
+ percentCourseGradeColumn.setAlignment(HorizontalAlignment.RIGHT);
+ percentCourseGradeColumn.setHidden(gbModel.getCategoryType() == CategoryType.SIMPLE_CATEGORIES);
+ percentCourseGradeColumn.setRenderer(numericCellRenderer);
+ percentCourseGradeColumn.setSortable(false);
+ columns.add(percentCourseGradeColumn);
+
+ percentCategoryColumn = new TreeTableColumn(ItemModel.Key.PERCENT_CATEGORY.name(),
+ ItemModel.getPropertyName(ItemModel.Key.PERCENT_CATEGORY), ItemModel.getPropertyName(ItemModel.Key.PERCENT_CATEGORY).length() * CHARACTER_WIDTH);
+ percentCategoryColumn.setAlignment(HorizontalAlignment.RIGHT);
+ percentCategoryColumn.setHidden(gbModel.getCategoryType() == CategoryType.SIMPLE_CATEGORIES);
+ percentCategoryColumn.setRenderer(numericCellRenderer);
+ percentCategoryColumn.setSortable(false);
+ columns.add(percentCategoryColumn);
+
+ /*TreeTableColumn weightColumn = new TreeTableColumn(ItemModel.Key.WEIGHT.name(),
+ ItemModel.getPropertyName(ItemModel.Key.WEIGHT), 80);
+ weightColumn.setAlignment(HorizontalAlignment.RIGHT);
+ weightColumn.setHidden(gbModel.getCategoryType() == CategoryType.SIMPLE_CATEGORIES);
+ weightColumn.setRenderer(numericCellRenderer);
+ weightColumn.setSortable(false);
+ columns.add(weightColumn);*/
+
+ /*TreeTableColumn extraCreditColumn = new TreeTableColumn(ItemModel.Key.EXTRA_CREDIT.name(),
+ ItemModel.getPropertyName(ItemModel.Key.EXTRA_CREDIT), ItemModel.getPropertyName(ItemModel.Key.EXTRA_CREDIT).length() * CHARACTER_WIDTH);
+ extraCreditColumn.setSortable(false);
+ extraCreditColumn.setRenderer(checkBoxCellRenderer);
+ */
+
+ //columns.add(extraCreditColumn);
+
+ treeTableColumnModel = new TreeTableColumnModel(columns);
+ treeTable = new TreeTable(treeTableColumnModel) {
+ @Override
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "treegrid");
+ Accessibility.setState(el().dom, "aria-labelledby", "itemtreelabel");
+ //if (editTree != null)
+ // editTree.setSize(XDOM.getViewportSize().width- 40, MultiGradeTreePanel.this.getHeight() - 40);
+ }
+ };
+ treeTable.setAnimate(false);
+ treeTable.getStyle().setLeafIconStyle("icon-page");
+ treeTable.expandAll();
+
+ //formPanel = createForm();
+ //formBindings = new FormBinding(formPanel, true);
+ //formBindings.setStore(treeStore);
+
+ treeTable.addListener(Events.RowDoubleClick, treeTableEventListener);
+
+ //GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ //ItemModel rootItemModel = selectedGradebook.getRootItemModel();
+ //treeLoader.load(rootItemModel);
+
+ ContentPanel editPanel = new ContentPanel();
+ editPanel.setHeaderVisible(false);
+ editPanel.setLayout(new RowLayout(Orientation.VERTICAL));
+
+ editPanel.add(treeTable, new RowData(1, 1));
+
+ I18nConstants i18n = Registry.get(AppConstants.I18N);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+
+ treeContextMenu = new Menu() {
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "menu");
+ }
+ };
+ treeContextMenu.setWidth(130);
+
+ addCategoryMenuItem = new MenuItem() {
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "menuitem");
+ }
+ };
+ addCategoryMenuItem.setItemId(AppConstants.ID_CT_ADD_CATEGORY_MENUITEM);
+ addCategoryMenuItem.setText(i18n.addCategoryHeading());
+ addCategoryMenuItem.addSelectionListener(menuSelectionListener);
+ treeContextMenu.add(addCategoryMenuItem);
+
+ addCategoryMenuItem.setVisible(selectedGradebook.getCategoryType() != CategoryType.NO_CATEGORIES);
+
+ MenuItem addItemMenuItem = new MenuItem() {
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "menuitem");
+ }
+ };
+ addItemMenuItem.setItemId(AppConstants.ID_CT_ADD_ITEM_MENUITEM);
+ addItemMenuItem.setText(i18n.addItemHeading());
+ addItemMenuItem.addSelectionListener(menuSelectionListener);
+ treeContextMenu.add(addItemMenuItem);
+
+ treeTable.setContextMenu(treeContextMenu);
+
+ return editPanel;
+ }
+
+ /*protected Tree newNavigationTree() {
+
+ I18nConstants i18n = Registry.get(AppConstants.I18N);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ ItemModel rootItemModel = selectedGradebook.getRootItemModel();
+
+ Tree tree = new Tree() {
+
+ @Override
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "tree");
+ Accessibility.setState(el().dom, "aria-labelledby", "itemtreelabel");
+ }
+
+ };
+ tree.addListener(Events.SelectionChange, treeEventListener);
+ tree.setSelectionModel(new TreeSelectionModel(SelectionMode.MULTI));
+
+ treeLoader = new BaseTreeLoader(new TreeModelReader());
+ treeStore = new TreeStore(treeLoader);
+
+ TreeBinder treeBinder = new TreeBinder(tree, treeStore) {
+
+ @Override
+ protected TreeItem createItem(ItemModel model) {
+ TreeItem item = new TreeItem() {
+ @Override
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "treeitem");
+ Accessibility.setState(el().dom, "aria-expanded", "false");
+ }
+ };
+
+ item.setId(new StringBuilder().append(model.getItemType()).append(":").append(model.getName()).toString());
+ item.addListener(Events.BeforeCollapse, treeEventListener);
+ item.addListener(Events.BeforeExpand, treeEventListener);
+
+ update(item, model);
+
+ if (loader != null) {
+ item.setLeaf(!loader.hasChildren(model));
+ } else {
+ item.setLeaf(!hasChildren(model));
+ }
+
+ setModel(item, model);
+ return item;
+ }
+
+ };
+ treeBinder.setDisplayProperty(ItemModel.Key.NAME.name());
+ treeBinder.setAutoLoad(true);
+ treeBinder.addSelectionChangedListener(selectionChangedListener);
+
+ treeLoader.load(rootItemModel);
+
+ tree.expandAll();
+
+ treeContextMenu = new Menu() {
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "menu");
+ }
+ };
+ treeContextMenu.setWidth(130);
+
+ addCategoryMenuItem = new MenuItem() {
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "menuitem");
+ }
+ };
+ addCategoryMenuItem.setItemId(AppConstants.ID_CT_ADD_CATEGORY_MENUITEM);
+ addCategoryMenuItem.setText(i18n.addCategoryHeading());
+ addCategoryMenuItem.addSelectionListener(menuSelectionListener);
+ treeContextMenu.add(addCategoryMenuItem);
+
+ addCategoryMenuItem.setVisible(selectedGradebook.getCategoryType() != CategoryType.NO_CATEGORIES);
+
+ MenuItem addItemMenuItem = new MenuItem() {
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+ Accessibility.setRole(el().dom, "menuitem");
+ }
+ };
+ addItemMenuItem.setItemId(AppConstants.ID_CT_ADD_ITEM_MENUITEM);
+ addItemMenuItem.setText(i18n.addItemHeading());
+ addItemMenuItem.addSelectionListener(menuSelectionListener);
+ treeContextMenu.add(addItemMenuItem);
+
+ tree.setContextMenu(treeContextMenu);
+
+ return tree;
+ }*/
+
+ @Override
+ protected void onRender(Element parent, int pos) {
+ super.onRender(parent, pos);
+ getHeader().setId("itemtreelabel");
+ Accessibility.setRole(el().dom, "region");
+ Accessibility.setRole(getHeader().el().dom, "heading");
+ }
+
+ private void initListeners() {
+ menuSelectionListener = new SelectionListener() {
+ public void componentSelected(MenuEvent ce) {
+ String itemId = ce.item.getItemId();
+ TreeItem item = (TreeItem) treeTable.getSelectionModel().getSelectedItem();
+ if (item != null) {
+ if (itemId.equals(AppConstants.ID_CT_ADD_CATEGORY_MENUITEM))
+ Dispatcher.forwardEvent(GradebookEvents.NewCategory, item.getModel());
+ else if (itemId.equals(AppConstants.ID_CT_ADD_ITEM_MENUITEM))
+ Dispatcher.forwardEvent(GradebookEvents.NewItem, item.getModel());
+ }
+ }
+ };
+ selectionChangedListener = new SelectionChangedListener() {
+
+ @Override
+ public void selectionChanged(SelectionChangedEvent se) {
+
+ if (!isEditMode) {
+ List selectedItemModels = se.getSelection();
+ Set selectedItemModelIdSet = new HashSet();
+ boolean selectAll = false;
+
+ for (ItemModel selectedItemModel : selectedItemModels) {
+ // If the root or gradebook is selected then we don't need to mess around any further
+ if (selectedItemModel.getItemType().equals(Type.ROOT.getName()) || selectedItemModel.getItemType().equals(Type.GRADEBOOK.getName())) {
+ selectAll = true;
+ break;
+ } else if (selectedItemModel.getItemType().equals(Type.CATEGORY.getName())) {
+ for (ItemModel childItemModel : selectedItemModel.getChildren())
+ selectedItemModelIdSet.add(childItemModel.getIdentifier());
+ } else
+ selectedItemModelIdSet.add(selectedItemModel.getIdentifier());
+ }
+
+ // Ensure that we always show either the id or the display name
+ if (!selectAll) {
+ if (!selectedItemModelIdSet.contains(StudentModel.Key.DISPLAY_ID.name())
+ && !selectedItemModelIdSet.contains(StudentModel.Key.DISPLAY_NAME.name()))
+ selectedItemModelIdSet.add(StudentModel.Key.DISPLAY_NAME.name());
+ }
+
+ Dispatcher.forwardEvent(GradebookEvents.ShowColumns, new ShowColumnsEvent(selectAll, selectedItemModelIdSet));
+ }
+ }
+
+ };
+
+ treeEventListener = new Listener() {
+
+ public void handleEvent(TreeEvent te) {
+ switch (te.type) {
+ case Events.BeforeExpand:
+ Accessibility.setState(te.item.getElement(), "aria-expanded", "true");
+ break;
+ case Events.BeforeCollapse:
+ Accessibility.setState(te.item.getElement(), "aria-expanded", "false");
+ break;
+ case Events.SelectionChange:
+ if (te.selected != null) {
+ StringBuilder listOfIds = new StringBuilder();
+ for (TreeItem item : te.selected) {
+ listOfIds.append(item.getId()).append(" ");
+ }
+ Accessibility.setState(te.tree.el().dom, "aria-activedescendant", listOfIds.toString());
+ }
+ break;
+ }
+ }
+
+ };
+
+ treeTableEventListener = new Listener() {
+ public void handleEvent(TreeTableEvent tte) {
+ switch (tte.type) {
+ case Events.RowDoubleClick:
+ if (tte.rowIndex > 0) {
+ ItemModel itemModel = (ItemModel)tte.item.getModel();
+ Dispatcher.forwardEvent(GradebookEvents.EditItem, itemModel);
+ } else {
+ Dispatcher.forwardEvent(GradebookEvents.EditItem, null);
+ }
+ tte.stopEvent();
+ break;
+ }
+ }
+ };
+ }
+
+}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsGradingScaleContentPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsGradingScaleContentPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsGradingScaleContentPanel.java (working copy)
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.DataTypeConversionUtil;
import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
@@ -65,7 +66,7 @@
@SuppressWarnings("unchecked")
- public SettingsGradingScaleContentPanel(final String gradebookUid) {
+ public SettingsGradingScaleContentPanel() {
super();
@@ -113,7 +114,7 @@
@Override
protected void load(ListLoadConfig listLoadConfig, AsyncCallback> callback) {
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
GradebookToolFacadeAsync service = Registry.get("service");
UserEntityGetAction action =
new UserEntityGetAction(gbModel, EntityType.GRADE_SCALE);
@@ -157,7 +158,7 @@
grid.getView().getCell(gridEvent.rowIndex, gridEvent.colIndex).setInnerText("Saving edit...");
GradeScaleRecordModel model = (GradeScaleRecordModel)record.getModel();
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
UserEntityUpdateAction action =
new UserEntityUpdateAction(gbModel, model, property, ClassType.DOUBLE, newValue, originalValue);
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/AddAssignmentDialog.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/AddAssignmentDialog.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/AddAssignmentDialog.java (working copy)
@@ -22,10 +22,13 @@
**********************************************************************************/
package org.sakaiproject.gradebook.gwt.client.gxt.settings;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
+import org.sakaiproject.gradebook.gwt.client.I18nConstants;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserAssignmentCreateAction;
import org.sakaiproject.gradebook.gwt.client.action.UserCategoryCreateAction;
@@ -34,11 +37,12 @@
import org.sakaiproject.gradebook.gwt.client.action.Action.EntityType;
import org.sakaiproject.gradebook.gwt.client.gxt.Notifier;
import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
-import org.sakaiproject.gradebook.gwt.client.gxt.event.UserChangeEvent;
import org.sakaiproject.gradebook.gwt.client.model.AssignmentModel;
import org.sakaiproject.gradebook.gwt.client.model.CategoryModel;
import org.sakaiproject.gradebook.gwt.client.model.EntityModelComparer;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel;
+import org.sakaiproject.gradebook.gwt.client.model.ItemModel.Type;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.Registry;
@@ -50,6 +54,7 @@
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.WindowEvent;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
@@ -68,49 +73,55 @@
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Accessibility;
public class AddAssignmentDialog extends Dialog {
private static final Notifier notifier = new Notifier();
-
- private String gradebookUid;
- private ContentPanel contentPanel;
-
- private String directionsText;
+
private LabelField directions;
private TextField assignmentName;
private NumberField assignmentWeight;
private NumberField assignmentPoints;
private DateField dueDate;
+ private ListStore categoriesStore;
private ComboBox categoryPicker;
+ private ListLoader categoriesLoader;
- public AddAssignmentDialog(final String gradebookUid, ContentPanel contentPanel) {
- this.gradebookUid = gradebookUid;
- this.contentPanel = contentPanel;
-
+ private Listener windowListener;
+
+ private ItemModel itemModel;
+
+ public AddAssignmentDialog() {
setModal(true);
- setResizable(true);
+ setResizable(true);
+ }
+
+ @Override
+ protected void onRender(Element parent, int pos) {
+ super.onRender(parent, pos);
- directionsText = "Please fill out the fields below. You may either select an existing category or type in the name of a new one.";
- directions = new LabelField(directionsText);
+ I18nConstants i18n = Registry.get(AppConstants.I18N);
+ directions = new LabelField(i18n.addItemDirections());
+
assignmentName = new TextField();
assignmentName.setAllowBlank(false);
- assignmentName.setEmptyText("Required");
- assignmentName.setFieldLabel("Name");
+ assignmentName.setEmptyText(i18n.requiredLabel());
+ assignmentName.setFieldLabel(i18n.addItemName());
assignmentPoints = new NumberField();
- assignmentPoints.setEmptyText("Optional - default is 100");
- assignmentPoints.setFieldLabel("Points");
+ assignmentPoints.setEmptyText(i18n.addItemPointsEmpty());
+ assignmentPoints.setFieldLabel(i18n.addItemPoints());
assignmentWeight = new NumberField();
- assignmentWeight.setEmptyText("Optional - default is same as points");
- assignmentWeight.setFieldLabel("Weight");
+ assignmentWeight.setEmptyText(i18n.addItemWeightEmpty());
+ assignmentWeight.setFieldLabel(i18n.addItemWeight());
assignmentWeight.setVisible(false);
dueDate = new DateField();
- dueDate.setEmptyText("Optional");
- dueDate.setFieldLabel("Due Date");
+ dueDate.setEmptyText(i18n.addItemDueDateEmpty());
+ dueDate.setFieldLabel(i18n.addItemDueDate());
final GradebookToolFacadeAsync service = Registry.get("service");
@@ -118,18 +129,18 @@
new RpcProxy>() {
@Override
protected void load(ListLoadConfig loadConfig, AsyncCallback> callback) {
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
UserEntityGetAction action = new UserEntityGetAction(gbModel, EntityType.CATEGORY);
//action.setShowAll(Boolean.FALSE);
service.getEntityList(action, callback);
}
};
- final ListLoader categoriesLoader = new BaseListLoader(categoriesProxy);
+ categoriesLoader = new BaseListLoader(categoriesProxy);
categoriesLoader.setRemoteSort(true);
- ListStore categoriesStore = new ListStore(categoriesLoader);
+ categoriesStore = new ListStore(categoriesLoader);
categoriesStore.setModelComparer(new EntityModelComparer());
categoryPicker = new ComboBox();
@@ -137,8 +148,8 @@
categoryPicker.setAllQuery(null);
categoryPicker.setDisplayField(CategoryModel.Key.NAME.name());
categoryPicker.setEditable(true);
- categoryPicker.setEmptyText("Required");
- categoryPicker.setFieldLabel("Category");
+ categoryPicker.setEmptyText(i18n.requiredLabel());
+ categoryPicker.setFieldLabel(i18n.categoryName());
categoryPicker.setForceSelection(false);
categoryPicker.setStore(categoriesStore);
categoryPicker.addSelectionChangedListener(new SelectionChangedListener() {
@@ -164,7 +175,7 @@
});
setButtons(Dialog.OK);
- setHeading("New Grade Item");
+ setHeading(i18n.addItemHeading());
setHideOnButtonClick(true);
setLayout(new FitLayout());
setWidth(400);
@@ -190,36 +201,12 @@
add(panel);
+ Accessibility.setRole(categoryPicker.getElement(), "combobox");
+ initListeners();
+
+ onCategorySelected();
// Before we show the dialog box each time we want to ensure that the fields are cleared out
- addListener(Events.BeforeShow, new Listener() {
-
- public void handleEvent(WindowEvent be) {
- GradebookModel gbModel = Registry.get(gradebookUid);
-
- switch (gbModel.getCategoryType()) {
- case NO_CATEGORIES:
- categoryPicker.setVisible(false);
- break;
- default:
- categoryPicker.setVisible(true);
- categoryPicker.setValue(null);
- categoryPicker.clearInvalid();
- categoriesLoader.load();
- break;
- }
-
- assignmentName.setValue(null);
- assignmentName.clearInvalid();
-
- assignmentWeight.setValue(null);
- assignmentWeight.setVisible(false);
- assignmentPoints.setValue(null);
- dueDate.setValue(null);
-
- }
-
- });
-
+ addListener(Events.BeforeShow, windowListener);
}
@@ -236,8 +223,9 @@
}
Long categoryId = null;
- GradebookModel gbModel = Registry.get(gradebookUid);
-
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
+ I18nConstants i18n = Registry.get(AppConstants.I18N);
+
switch (gbModel.getCategoryType()) {
case SIMPLE_CATEGORIES:
case WEIGHTED_CATEGORIES:
@@ -249,35 +237,34 @@
} else {
String categoryName = categoryPicker.getRawValue();
if (!categoryName.trim().equals("")) {
- addCategory(categoryName);
+ addCategory(categoryName, gbModel);
super.onButtonPressed(button);
return;
}
}
if (categoryId == null) {
- notifier.notify("No category selected", "You must choose a category");
+ notifier.notify(i18n.addItemNoCategoryHeading(), i18n.addItemNoCategoryMessage());
return;
}
break;
}
super.onButtonPressed(button);
- addAssignment(categoryId);
+ addAssignment(categoryId, gbModel);
}
- @Override
+ /*@Override
protected void onRender(Element parent, int pos) {
super.onRender(parent, pos);
if (categoryPicker.isVisible())
categoryPicker.focus();
- }
+ }*/
- private void addAssignment(Long categoryId) {
+ private void addAssignment(Long categoryId, GradebookModel gbModel) {
- GradebookModel gbModel = Registry.get(gradebookUid);
UserAssignmentCreateAction action =
new UserAssignmentCreateAction(gbModel,
categoryId,
@@ -293,8 +280,7 @@
action.setModel(result);
- if (contentPanel != null)
- contentPanel.fireEvent(GradebookEvents.UserChange, new UserChangeEvent(action));
+ Dispatcher.forwardEvent(GradebookEvents.UserChange, action);
}
};
@@ -302,14 +288,12 @@
remoteCommand.execute(action);
}
- private void addCategory(String categoryName) {
+ private void addCategory(String categoryName, final GradebookModel gbModel) {
Double weight = null;
Boolean isEqualWeight = null;
Integer dropLowest = null;
- GradebookModel gbModel = Registry.get(gradebookUid);
-
UserCategoryCreateAction action =
new UserCategoryCreateAction(gbModel,
categoryName, weight, isEqualWeight, dropLowest);
@@ -321,27 +305,75 @@
public void onCommandSuccess(UserEntityAction action, CategoryModel result) {
notifier.notify("Category Added", "Created new category as '{0}' ", result.getName());
Long categoryId = result == null ? null : Long.valueOf(result.getIdentifier());
- addAssignment(categoryId);
+ addAssignment(categoryId, gbModel);
action.setModel(result);
- if (contentPanel != null)
- contentPanel.fireEvent(GradebookEvents.UserChange, new UserChangeEvent(action));
+ Dispatcher.forwardEvent(GradebookEvents.UserChange, action);
}
};
remoteCommand.execute(action);
}
+
+ private void initListeners() {
+ windowListener = new Listener() {
+ public void handleEvent(WindowEvent be) {
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
+
+ switch (gbModel.getCategoryType()) {
+ case NO_CATEGORIES:
+ categoryPicker.setVisible(false);
+ break;
+ default:
+ categoryPicker.setVisible(true);
+ categoryPicker.setValue(null);
+ categoryPicker.clearInvalid();
+ if (categoriesLoader != null)
+ categoriesLoader.load();
+ break;
+ }
+
+ onCategorySelected();
+
+ assignmentName.setValue(null);
+ assignmentName.clearInvalid();
+
+ assignmentWeight.setValue(null);
+ assignmentWeight.setVisible(false);
+ assignmentPoints.setValue(null);
+ dueDate.setValue(null);
+
+ }
+
+ };
+ }
+
+ private void onCategorySelected() {
+ if (categoryPicker == null)
+ return;
+
+ ItemModel itemModel = getItemModel();
+ if (itemModel != null) {
+ if (!itemModel.getItemType().equals(Type.CATEGORY.getName())) {
+ itemModel = itemModel.getParent();
+ }
+
+ if (itemModel.getItemType().equals(Type.CATEGORY.getName())) {
+ CategoryModel categoryModel = categoriesStore.findModel(CategoryModel.Key.ID.name(), getItemModel().getIdentifier());
+ categoryPicker.setValue(categoryModel);
+ }
+ }
+ }
- public ContentPanel getSettingsPanel() {
- return contentPanel;
+ public ItemModel getItemModel() {
+ return itemModel;
}
-
- public void setSettingsPanel(ContentPanel contentParent) {
- this.contentPanel = contentParent;
+ public void setItemModel(ItemModel itemModel) {
+ this.itemModel = itemModel;
}
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsAssignmentContentPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsAssignmentContentPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsAssignmentContentPanel.java (working copy)
@@ -26,7 +26,8 @@
import java.util.List;
import java.util.Map;
-import org.sakaiproject.gradebook.gwt.client.GradebookConstants;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
+import org.sakaiproject.gradebook.gwt.client.I18nConstants;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityUpdateAction;
@@ -288,7 +289,7 @@
columns.add(removedColumn);
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
switch (gbModel.getCategoryType()) {
case WEIGHTED_CATEGORIES:
weightColumn.setHidden(false);
@@ -298,7 +299,7 @@
break;
}
- CustomColumnModel cm = new CustomColumnModel(gradebookUid, gridId, columns);
+ CustomColumnModel cm = new CustomColumnModel(gbModel.getGradebookUid(), gridId, columns);
return cm;
}
@@ -382,7 +383,7 @@
}
}
};
- GradebookConstants i18n = Registry.get("i18n");
+ I18nConstants i18n = Registry.get("i18n");
verify.addText(i18n.changingPointsRecalculatesGrades());
verify.setBodyStyleName("pad-text");
verify.setButtons(Dialog.YESNOCANCEL);
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/AddCategoryDialog.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/AddCategoryDialog.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/AddCategoryDialog.java (working copy)
@@ -22,12 +22,12 @@
**********************************************************************************/
package org.sakaiproject.gradebook.gwt.client.gxt.settings;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserCategoryCreateAction;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
import org.sakaiproject.gradebook.gwt.client.gxt.Notifier;
import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
-import org.sakaiproject.gradebook.gwt.client.gxt.event.UserChangeEvent;
import org.sakaiproject.gradebook.gwt.client.model.CategoryModel;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel;
import org.sakaiproject.gradebook.gwt.client.model.GradebookModel.CategoryType;
@@ -36,6 +36,7 @@
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.WindowEvent;
+import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
@@ -55,9 +56,7 @@
public class AddCategoryDialog extends Dialog {
private static final Notifier notifier = new Notifier();
-
- private String gradebookUid;
- private ContentPanel contentPanel;
+
private String directionsText;
private LabelField directions;
private TextField categoryName;
@@ -65,9 +64,7 @@
private CheckBox equalWeight;
private NumberField dropLowest;
- public AddCategoryDialog(String gradebookUid, ContentPanel contentPanel) {
- this.gradebookUid = gradebookUid;
- this.contentPanel = contentPanel;
+ public AddCategoryDialog() {
this.directionsText = "Please fill out the fields below. If you choose to equally weight assignments, then each assignment will contribute an equal percent to the category grade.";
this.directions = new LabelField(directionsText);
@@ -122,7 +119,7 @@
addListener(Events.BeforeShow, new Listener() {
public void handleEvent(WindowEvent be) {
- GradebookModel gbModel = Registry.get(getGradebookUid());
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
// Ensure that the category name is blank
categoryName.setValue(null);
// And that it is not showing the "Required" warning
@@ -153,7 +150,7 @@
super.onButtonPressed(button);
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
UserCategoryCreateAction action =
new UserCategoryCreateAction(gbModel,
getCategoryName().getValue(),
@@ -169,9 +166,7 @@
action.setModel(result);
- if (contentPanel != null)
- contentPanel.fireEvent(GradebookEvents.UserChange, new UserChangeEvent(action));
-
+ Dispatcher.forwardEvent(GradebookEvents.UserChange, action);
}
};
@@ -184,10 +179,6 @@
categoryName.focus();
}
-
- public String getGradebookUid() {
- return gradebookUid;
- }
public TextField getCategoryName() {
return categoryName;
@@ -228,13 +219,4 @@
this.dropLowest = dropLowest;
}
-
- public ContentPanel getSettingsPanel() {
- return contentPanel;
- }
-
-
- public void setSettingsPanel(ContentPanel contentPanel) {
- this.contentPanel = contentPanel;
- }
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsGridPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsGridPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsGridPanel.java (working copy)
@@ -26,6 +26,7 @@
import java.util.List;
import java.util.Map;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
import org.sakaiproject.gradebook.gwt.client.action.PageRequestAction;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
@@ -53,6 +54,7 @@
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Record;
import com.extjs.gxt.ui.client.util.Params;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
@@ -106,14 +108,15 @@
};
public SettingsGridPanel(String gradebookUid, String gridId, EntityType entityType) {
- super(gradebookUid, gridId, entityType);
+ super(gridId, entityType);
setTopComponent(pagingToolBar);
}
public void reloadWeights(ItemEntityModel.Key key, M changedModel) {
GradebookToolFacadeAsync service = Registry.get("service");
- PageRequestAction pageAction = newPageRequestAction();
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ PageRequestAction pageAction = newPageRequestAction(selectedGradebook);
boolean isDeleted = changedModel.getRemoved() != null && changedModel.getRemoved().booleanValue();
boolean showDeleted = showDeletedItems != null && showDeletedItems.isPressed();
@@ -146,7 +149,7 @@
//protected abstract void doCall(GradebookModel model, GradebookToolFacadeAsync service, boolean showDeleted, AsyncCallback> callback);
@Override
- protected void addComponents() {
+ protected void addComponents(ContentPanel owner) {
this.defaultTextField = new TextField();
this.defaultTextField.addInputStyleName("gbTextFieldInput");
@@ -184,7 +187,7 @@
includedColumn.setMenuDisabled(true);
includedColumn.setSortable(false);
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
weightColumn = new SummaryColumnConfig(AssignmentModel.Key.WEIGHT.name(),
ItemEntityModel.getPropertyName(CategoryModel.Key.WEIGHT), 80);
weightColumn.setAlignment(HorizontalAlignment.RIGHT);
@@ -362,9 +365,8 @@
}*/
@Override
- protected PageRequestAction newPageRequestAction() {
- GradebookModel model = Registry.get(gradebookUid);
- PageRequestAction pageRequestAction = new PageRequestAction(entityType, model.getGradebookUid(), model.getGradebookId());
+ protected PageRequestAction newPageRequestAction(GradebookModel selectedGradebook) {
+ PageRequestAction pageRequestAction = new PageRequestAction(entityType, selectedGradebook.getGradebookUid(), selectedGradebook.getGradebookId());
boolean showDeleted = showDeletedItems != null && showDeletedItems.isPressed();
// The undelete view is the less restricted view, therefore it's equivalent to include all
@@ -388,7 +390,8 @@
@Override
protected void changeValue(final Record record, final String property, Boolean value, Boolean startValue) {
- UserEntityUpdateAction action = newEntityUpdateAction(record, property, value, startValue, null);
+ GradebookModel selectedGradebook = Registry.get(AppConstants.CURRENT);
+ UserEntityUpdateAction action = newEntityUpdateAction(selectedGradebook, record, property, value, startValue, null);
// Since we're not passing a gridEvent on in this case, we need to set the entity name here
EntityModel model = (EntityModel)record.getModel();
if (model != null) {
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsCategoryContentPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsCategoryContentPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsCategoryContentPanel.java (working copy)
@@ -26,12 +26,12 @@
import java.util.List;
import java.util.Map;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityUpdateAction;
import org.sakaiproject.gradebook.gwt.client.action.Action.EntityType;
import org.sakaiproject.gradebook.gwt.client.custom.widget.grid.CustomColumnModel;
-import org.sakaiproject.gradebook.gwt.client.gxt.Notifier;
import org.sakaiproject.gradebook.gwt.client.gxt.event.GradebookEvents;
import org.sakaiproject.gradebook.gwt.client.gxt.event.UserChangeEvent;
import org.sakaiproject.gradebook.gwt.client.model.AssignmentModel;
@@ -262,7 +262,7 @@
columns.add(removedColumn);
- GradebookModel gbModel = Registry.get(gradebookUid);
+ GradebookModel gbModel = Registry.get(AppConstants.CURRENT);
switch (gbModel.getCategoryType()) {
case WEIGHTED_CATEGORIES:
weightColumn.setHidden(false);
@@ -274,7 +274,7 @@
break;
}
- CustomColumnModel columnModel = new CustomColumnModel(gradebookUid, gridId, columns);
+ CustomColumnModel columnModel = new CustomColumnModel(gbModel.getGradebookUid(), gridId, columns);
return columnModel;
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsContentPanel.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsContentPanel.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/settings/SettingsContentPanel.java (working copy)
@@ -67,7 +67,7 @@
assignmentsPanel = new SettingsAssignmentContentPanel(gradebookUid, categoriesPanel);
- gradingScalePanel = new SettingsGradingScaleContentPanel(gradebookUid);
+ gradingScalePanel = new SettingsGradingScaleContentPanel();
tabPanel = new TabPanel();
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/NotifyingAsyncCallback.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/NotifyingAsyncCallback.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/NotifyingAsyncCallback.java (working copy)
@@ -22,7 +22,7 @@
**********************************************************************************/
package org.sakaiproject.gradebook.gwt.client.gxt;
-import org.sakaiproject.gradebook.gwt.client.GradebookConstants;
+import org.sakaiproject.gradebook.gwt.client.I18nConstants;
import org.sakaiproject.gradebook.gwt.client.exceptions.InvalidInputException;
import com.extjs.gxt.ui.client.Registry;
@@ -37,7 +37,7 @@
}
public void onFailure(Throwable caught) {
- GradebookConstants i18n = Registry.get("i18n");
+ I18nConstants i18n = Registry.get("i18n");
String message = i18n.unknownException();
if (caught.getMessage() != null)
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/HistoryDialog.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/HistoryDialog.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/HistoryDialog.java (working copy)
@@ -44,16 +44,11 @@
private String gradebookUid;
- public HistoryDialog(String gradebookUid) {
+ public HistoryDialog() {
super();
- this.gradebookUid = gradebookUid;
- //setClosable(false);
- //setDraggable(false);
setFrame(false);
setHeaderVisible(false);
setLayout(new FitLayout());
- //setModal(false);
- //setResizable(false);
}
protected void onRender(Element parent, int pos) {
@@ -62,16 +57,16 @@
//setSize(XDOM.getViewportSize().width - 40, XDOM.getViewportSize().height - 200);
final GridPanel gridPanel =
- new GridPanel(gradebookUid, "history", EntityType.ACTION) {
+ new GridPanel("history", EntityType.ACTION) {
@Override
- protected void addComponents() {
- setTopComponent(pagingToolBar);
+ protected void addComponents(ContentPanel owner) {
+ owner.setTopComponent(pagingToolBar);
}
@Override
- protected Grid newGrid() {
- Grid grid = super.newGrid();
+ protected Grid newGrid(ContentPanel owner) {
+ Grid grid = super.newGrid(owner);
grid.setAutoExpandColumn(Action.Key.DESCRIPTION.name());
return grid;
}
Index: client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/StudentViewContainer.java
===================================================================
--- client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/StudentViewContainer.java (revision 58233)
+++ client/src/java/org/sakaiproject/gradebook/gwt/client/gxt/StudentViewContainer.java (working copy)
@@ -25,7 +25,7 @@
import java.util.ArrayList;
import java.util.List;
-import org.sakaiproject.gradebook.gwt.client.GradebookToolFacadeAsync;
+import org.sakaiproject.gradebook.gwt.client.AppConstants;
import org.sakaiproject.gradebook.gwt.client.action.PageRequestAction;
import org.sakaiproject.gradebook.gwt.client.action.RemoteCommand;
import org.sakaiproject.gradebook.gwt.client.action.UserEntityAction;
@@ -70,7 +70,6 @@
import com.extjs.gxt.ui.client.widget.layout.RowData;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.google.gwt.i18n.client.NumberFormat;
-import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
@@ -79,7 +78,7 @@
private static final Notifier notifier = new Notifier();
private static final String GRID_ID = "singlegrade";
- private String gradebookUid;
+ //private String gradebookUid;
private TextField defaultTextField= new TextField();
private TextArea defaultTextArea = new TextArea();
private NumberFormat defaultNumberFormat = NumberFormat.getFormat("#.###");
@@ -92,12 +91,14 @@
private int pageSize = 10;
- private StudentModel studentModel;
+ private StudentModel learnerGradeRecordCollection;
private boolean isStudentView;
- public StudentViewContainer(final String gradebookUid, final GradebookToolFacadeAsync toolSrv, final boolean isStudentView) {
- this.gradebookUid = gradebookUid;
+ private GradebookModel selectedGradebook;
+
+ public StudentViewContainer(boolean isStudentView) {
+ //this.gradebookUid = gradebookUid;
this.isStudentView = isStudentView;
this.defaultNumberField.setFormat(defaultNumberFormat);
this.defaultNumberField.setSelectOnFocus(true);
@@ -119,12 +120,70 @@
studentInformationPanel.setScrollMode(Scroll.AUTO);
studentInformationPanel.add(studentInformation);
add(studentInformationPanel, new RowData(1, -1, new Margins(5, 0, 0, 0)));
+
+ }
+
+ public StudentModel getStudentRow() {
+ return learnerGradeRecordCollection;
+ }
+
+ public void onChangeModel(GradebookModel selectedGradebook, StudentModel learnerGradeRecordCollection) {
+ if (learnerGradeRecordCollection != null) {
+ this.selectedGradebook = selectedGradebook;
+ this.learnerGradeRecordCollection = learnerGradeRecordCollection;
+
+ if (gradeItemsPanel == null)
+ gradeItemsPanel = newGradeItemsPanel();
+
+ if (logColumn != null)
+ logColumn.setStudent(learnerGradeRecordCollection);
+ updateCourseGrade(learnerGradeRecordCollection.getStudentGrade());
+ gradeItemsPanel.getLoader().load(0, pageSize);
+ setStudentInfoTable();
+ }
+ }
+
+ public void onResize(int x, int y) {
+ super.onResize(x, y);
- gradeItemsPanel = new GridPanel