Skip to content

Commit 42f2bc2

Browse files
committed
WCAG: Course Timetabling
- a few additional improvements, including - Room Groups: alt for default room group check - Saved Timetables: ARIA labels for the list boxes - Suggestions: improved keyboard accessibility - Conflict-Based Statistics: improved keyboard accessibility
1 parent 718c36b commit 42f2bc2

7 files changed

Lines changed: 54 additions & 16 deletions

File tree

JavaSource/org/unitime/timetable/gwt/client/rooms/RoomGroupsTable.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,11 @@ protected Widget getCell(final GroupInterface group, final RoomGroupsColumn colu
183183
case ABBREVIATION:
184184
return new Label(group.getAbbreviation() == null ? "" : group.getAbbreviation(), false);
185185
case DEFAULT:
186-
if (group.isDefault())
187-
return new Image(RESOURCES.on());
188-
else
186+
if (group.isDefault()) {
187+
Image on = new Image(RESOURCES.on());
188+
on.setAltText(MESSAGES.exportTrue());
189+
return on;
190+
} else
189191
return null;
190192
case DEPARTMENT:
191193
return new DepartmentCell(true, iProperties, group.getDepartment());

JavaSource/org/unitime/timetable/gwt/client/solver/DataTable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public String getName() {
132132
}
133133
int rowIdx = addRow(row, line);
134134
if (row.isSelected()) {
135-
getRowFormatter().setStyleName(rowIdx, "unitime-TableRowSelected");
135+
getRowFormatter().addStyleName(rowIdx, "unitime-TableRowSelected");
136136
}
137137
}
138138
for (int i = 0; i < table.getHeader().length; i++)

JavaSource/org/unitime/timetable/gwt/client/solver/ListSolutionsPage.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,15 @@
5252
import org.unitime.timetable.gwt.shared.SolverInterface.SolverOwner;
5353
import org.unitime.timetable.gwt.shared.TableInterface.TableRowInterface;
5454

55+
import com.google.gwt.aria.client.Id;
56+
import com.google.gwt.aria.client.Roles;
5557
import com.google.gwt.core.client.GWT;
5658
import com.google.gwt.event.dom.client.ClickEvent;
5759
import com.google.gwt.event.dom.client.ClickHandler;
5860
import com.google.gwt.event.logical.shared.ValueChangeEvent;
5961
import com.google.gwt.event.logical.shared.ValueChangeHandler;
6062
import com.google.gwt.user.client.Command;
63+
import com.google.gwt.user.client.DOM;
6164
import com.google.gwt.user.client.TakesValue;
6265
import com.google.gwt.user.client.rpc.AsyncCallback;
6366
import com.google.gwt.user.client.ui.HTML;
@@ -368,9 +371,13 @@ public void onClick(ClickEvent event) {
368371
if (load && iSolverConfig != null) {
369372
P loadPanel = new P("load-panel");
370373
P configLabel = new P("config-label"); configLabel.setText(MESSAGES.propSolverConfig()); loadPanel.add(configLabel);
374+
configLabel.getElement().setId(DOM.createUniqueId());
375+
Roles.getListboxRole().setAriaLabelledbyProperty(iSolverConfig.getElement(), Id.of(configLabel.getElement()));
371376
loadPanel.add(iSolverConfig);
372377
if (iSolverHost != null) {
373378
P hostLabel = new P("host-label"); hostLabel.setText(MESSAGES.propSolverHost()); loadPanel.add(hostLabel);
379+
hostLabel.getElement().setId(DOM.createUniqueId());
380+
Roles.getListboxRole().setAriaLabelledbyProperty(iSolverHost.getElement(), Id.of(hostLabel.getElement()));
374381
loadPanel.add(iSolverHost);
375382
}
376383
AriaButton button = new AriaButton(MESSAGES.opSolverLoad()); button.addClickHandler(createClickHandler(iTableHeader, SolutionOperation.LOAD));
@@ -422,11 +429,17 @@ public void onMouseClick(TableEvent<TableRowInterface> event) {
422429
iSolverOwner.addItem(owner.getName(), owner.getId().toString());
423430
}
424431
P ownerLabel = new P("owner-label"); ownerLabel.setText(MESSAGES.propSolverOwner()); loadPanel.add(ownerLabel);
432+
ownerLabel.getElement().setId(DOM.createUniqueId());
433+
Roles.getListboxRole().setAriaLabelledbyProperty(iSolverOwner.getElement(), Id.of(ownerLabel.getElement()));
425434
loadPanel.add(iSolverOwner);
426435
P configLabel = new P("config-label"); configLabel.setText(MESSAGES.propSolverConfig()); loadPanel.add(configLabel);
427436
loadPanel.add(iSolverConfig);
437+
configLabel.getElement().setId(DOM.createUniqueId());
438+
Roles.getListboxRole().setAriaLabelledbyProperty(iSolverConfig.getElement(), Id.of(configLabel.getElement()));
428439
if (iSolverHost != null) {
429440
P hostLabel = new P("host-label"); hostLabel.setText(MESSAGES.propSolverHost()); loadPanel.add(hostLabel);
441+
hostLabel.getElement().setId(DOM.createUniqueId());
442+
Roles.getListboxRole().setAriaLabelledbyProperty(iSolverHost.getElement(), Id.of(hostLabel.getElement()));
430443
loadPanel.add(iSolverHost);
431444
}
432445
AriaButton button = new AriaButton(MESSAGES.opSolverLoadEmptySolution()); button.addClickHandler(createClickHandler(iTableHeader, SolutionOperation.LOAD_EMPTY));

JavaSource/org/unitime/timetable/gwt/client/solver/suggestions/AssignmentTable.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.TreeSet;
2626

2727
import org.unitime.timetable.gwt.client.TimeHint;
28+
import org.unitime.timetable.gwt.client.aria.ImageButton;
2829
import org.unitime.timetable.gwt.client.rooms.RoomHint;
2930
import org.unitime.timetable.gwt.client.solver.SolverCookie;
3031
import org.unitime.timetable.gwt.client.widgets.P;
@@ -53,7 +54,6 @@
5354
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
5455
import com.google.gwt.user.client.ui.Widget;
5556
import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;
56-
import com.google.gwt.user.client.ui.Image;
5757
import com.google.gwt.user.client.ui.Label;
5858

5959
/**
@@ -206,9 +206,10 @@ protected Widget getCell(final ClassAssignmentDetails details, final AssignmentC
206206
case CLASS:
207207
if (iCanRemove) {
208208
P clazz = new P("class");
209-
Image image = new Image(RESOURCES.delete());
209+
ImageButton image = new ImageButton(RESOURCES.delete());
210210
image.addStyleName("delete");
211211
image.setTitle(MESSAGES.titleRemoveSelectedClassAssignment(details.getClazz().getName()));
212+
image.setAltText(MESSAGES.titleRemoveSelectedClassAssignment(details.getClazz().getName()));
212213
image.addClickHandler(new ClickHandler() {
213214
@Override
214215
public void onClick(ClickEvent event) {

JavaSource/org/unitime/timetable/gwt/client/solver/suggestions/CurrentAssignment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ else if (details.getRoom() != null)
170170
} else {
171171
iRooms = null;
172172
}
173-
if (details.getClazz().nrRooms() > 0 && details.getClazz().getRoomCapacity() > 0)
173+
if (details.getClazz().nrRooms() > 0 && details.getClazz().getRoomCapacity() > 0 && details.getClazz().getRoomCapacity() < Integer.MAX_VALUE)
174174
addRow(MESSAGES.propMinimumRoomSize(), new Label(String.valueOf(details.getClazz().getRoomCapacity())));
175175
if (details.getClazz().getNote() != null && !details.getClazz().getNote().isEmpty()) {
176176
addRow(MESSAGES.propNote(), new HTML(details.getClazz().getNote()));

JavaSource/org/unitime/timetable/gwt/client/solver/suggestions/SelectedSuggestion.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,33 +77,33 @@ protected void onRemove(ClassAssignmentDetails details) {
7777
iContext.remove(details.getClazz());
7878
}
7979
};
80+
at.addMouseClickListener(new MouseClickListener<ClassAssignmentDetails>() {
81+
@Override
82+
public void onMouseClick(TableEvent<ClassAssignmentDetails> event) {
83+
if (event.getData() != null) iContext.select(event.getData().getClazz());
84+
}
85+
});
8086
for (ClassAssignmentDetails d: suggestion.getDifferentAssignments()) {
8187
at.addRow(d);
8288
if (d.hasConflict()) at.setColumnVisible(at.getCellIndex(AssignmentTable.AssignmentColumn.CONSTRAINT), true);
8389
}
8490
addHeaderRow(MESSAGES.headerSelectedAssignment());
8591
addRow(at);
92+
}
93+
if (suggestion.hasUnresolvedConflicts()) {
94+
AssignmentTable at = new AssignmentTable(iContext.getProperties(), true, false);
8695
at.addMouseClickListener(new MouseClickListener<ClassAssignmentDetails>() {
8796
@Override
8897
public void onMouseClick(TableEvent<ClassAssignmentDetails> event) {
8998
if (event.getData() != null) iContext.select(event.getData().getClazz());
9099
}
91100
});
92-
}
93-
if (suggestion.hasUnresolvedConflicts()) {
94-
AssignmentTable at = new AssignmentTable(iContext.getProperties(), true, false);
95101
for (ClassAssignmentDetails d: suggestion.getUnresolvedConflicts()) {
96102
at.addRow(d);
97103
if (d.hasConflict()) at.setColumnVisible(at.getCellIndex(AssignmentTable.AssignmentColumn.CONSTRAINT), true);
98104
}
99105
addHeaderRow(MESSAGES.headerConflictingAssignments());
100106
addRow(at);
101-
at.addMouseClickListener(new MouseClickListener<ClassAssignmentDetails>() {
102-
@Override
103-
public void onMouseClick(TableEvent<ClassAssignmentDetails> event) {
104-
if (event.getData() != null) iContext.select(event.getData().getClazz());
105-
}
106-
});
107107
}
108108
if (suggestion.getUnassignedVariables() != suggestion.getBaseUnassignedVariables())
109109
addRow(MESSAGES.propNotAssignedClasses(), new HTML(iContext.dispNumber(suggestion.getUnassignedVariables(),suggestion.getBaseUnassignedVariables()), false));

WebContent/styles/unitime.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6305,6 +6305,7 @@ unitime-RoomSharingWidget .legend .blank {
63056305
cursor: pointer;
63066306
cursor: hand;
63076307
padding-right: 1px;
6308+
margin: 1px 5px 0px 5px;
63086309
}
63096310

63106311
.unitime-ClassAssignmentTable .classes .label {
@@ -6370,6 +6371,11 @@ unitime-RoomSharingWidget .legend .blank {
63706371

63716372
.unitime-ConflictBasedStatistics .cbs-node {
63726373
white-space: nowrap;
6374+
padding: 1px 3px 1px 3px;
6375+
}
6376+
6377+
.unitime-ConflictBasedStatistics:focus-within .gwt-TreeItem-selected .cbs-node {
6378+
background: #d3def6 url(../unitime/gwt/standard/images/hborder.png) repeat-x 0px -1463px;
63736379
}
63746380

63756381
.unitime-ConflictBasedStatistics table {
@@ -8613,6 +8619,14 @@ unitime-RoomSharingWidget .legend .blank {
86138619
white-space: nowrap;
86148620
}
86158621

8622+
.unitime-RoomGroupEdit .unitime-Rooms .pref-2 {
8623+
background: white;
8624+
}
8625+
8626+
.unitime-RoomFeatureEdit .unitime-Rooms .pref-2 {
8627+
background: white;
8628+
}
8629+
86168630
.pref-3 {
86178631
background-color: #DCB43C;
86188632
color: black;
@@ -8696,6 +8710,10 @@ unitime-RoomSharingWidget .legend .blank {
86968710
height: 24px;
86978711
}
86988712

8713+
.unitime-FocusableTable .focusable-cell {
8714+
min-width: 24px;
8715+
}
8716+
86998717
.unitime-CourseCurriculaTable {
87008718
width: 100%;
87018719
}
@@ -8725,6 +8743,10 @@ unitime-RoomSharingWidget .legend .blank {
87258743
outline: 1px solid blue !important;
87268744
}
87278745

8746+
.gwt-Tree .gwt-TreeItem-selected .gwt-Label {
8747+
background: inherit;
8748+
}
8749+
87288750
.unitime-ExamOwnersTable .unitime-ImageButton {
87298751
vertical-align: text-top;
87308752
margin: 1px 5px 0px 5px;

0 commit comments

Comments
 (0)