Improvements and new version in development #5
8
pom.xml
8
pom.xml
|
@ -30,12 +30,12 @@
|
|||
<dependency>
|
||||
<groupId>commons-cli</groupId>
|
||||
<artifactId>commons-cli</artifactId>
|
||||
<version>RELEASE</version>
|
||||
<version>1.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-email</groupId>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-email</artifactId>
|
||||
<version>RELEASE</version>
|
||||
<version>1.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains</groupId>
|
||||
|
@ -46,7 +46,7 @@
|
|||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>RELEASE</version>
|
||||
<version>4.5.6</version>
|
||||
</dependency>
|
||||
<!-- Github API Object Library -->
|
||||
<dependency>
|
||||
|
|
|
@ -251,7 +251,7 @@ public class GithubManager {
|
|||
return;
|
||||
}
|
||||
|
||||
team.setRepository(repo);
|
||||
team.setRepositoryName(repo.getName());
|
||||
team.setTaTeam(taTeam);
|
||||
|
||||
this.protectMasterBranch(repo, taTeam.getGithubTeam());
|
||||
|
@ -339,7 +339,7 @@ public class GithubManager {
|
|||
GHUser user = this.github.getUser(student.getGithubUsername());
|
||||
|
||||
this.addCollaboratorToRepo(user, assignmentsRepo);
|
||||
this.addCollaboratorToRepo(user, team.getRepository());
|
||||
this.addCollaboratorToRepo(user, this.organization.getRepository(team.getRepositoryName()));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.severe("Could not add students as collaborators to assignments or their repo.\n" + team);
|
||||
|
|
|
@ -21,25 +21,25 @@ public abstract class Person extends BaseEntity implements Detailable {
|
|||
/**
|
||||
* The unique identification number for this person. (P- or S-Number)
|
||||
*/
|
||||
@Column(name="number")
|
||||
@Column(name="number", nullable = false)
|
||||
protected int number;
|
||||
|
||||
/**
|
||||
* The person's first and last name.
|
||||
*/
|
||||
@Column(name="name")
|
||||
@Column(name="name", nullable = false)
|
||||
protected String name;
|
||||
|
||||
/**
|
||||
* The person's email address.
|
||||
*/
|
||||
@Column(name="email_address")
|
||||
@Column(name="email_address", nullable = false)
|
||||
protected String emailAddress;
|
||||
|
||||
/**
|
||||
* The person's github username.
|
||||
*/
|
||||
@Column(name="github_username")
|
||||
@Column(name="github_username", nullable = false)
|
||||
protected String githubUsername;
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
package nl.andrewlalis.model;
|
||||
|
||||
import org.kohsuke.github.GHRepository;
|
||||
import nl.andrewlalis.util.Pair;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Transient;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents one or more students' collective information.
|
||||
|
@ -18,8 +19,8 @@ public class StudentTeam extends Team {
|
|||
/**
|
||||
* The repository belonging to this team.
|
||||
*/
|
||||
@Transient
|
||||
private GHRepository repository;
|
||||
@Column(name = "repository_name", unique = true)
|
||||
private String repositoryName;
|
||||
|
||||
/**
|
||||
* The TATeam responsible for this student team.
|
||||
|
@ -97,12 +98,12 @@ public class StudentTeam extends Team {
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
public GHRepository getRepository() {
|
||||
return this.repository;
|
||||
public String getRepositoryName() {
|
||||
return this.repositoryName;
|
||||
}
|
||||
|
||||
public void setRepository(GHRepository repo) {
|
||||
this.repository = repo;
|
||||
public void setRepositoryName(String repositoryName) {
|
||||
this.repositoryName = repositoryName;
|
||||
}
|
||||
|
||||
public TATeam getTaTeam() {
|
||||
|
@ -117,4 +118,17 @@ public class StudentTeam extends Team {
|
|||
public String getDetailName() {
|
||||
return this.generateRepoDescription();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Pair<String, String>> getDetailPairs() {
|
||||
List<Pair<String, String>> pairs = super.getDetailPairs();
|
||||
pairs.add(new Pair<>("Repository Name", this.getRepositoryName()));
|
||||
String taTeamName = "None";
|
||||
if (this.getTaTeam() != null) {
|
||||
taTeamName = this.getTaTeam().getDetailName();
|
||||
}
|
||||
pairs.add(new Pair<>("TA Team", taTeamName));
|
||||
|
||||
return pairs;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
package nl.andrewlalis.ui.control.listeners.management_view;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.PopupMenuEvent;
|
||||
import javax.swing.event.PopupMenuListener;
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* This listener, when added to a JPopupMenu, will select the clicked row when a user right-clicks on the table.
|
||||
*/
|
||||
public class PopupSelector implements PopupMenuListener {
|
||||
|
||||
/**
|
||||
* The table on which to select rows.
|
||||
*/
|
||||
private JTable table;
|
||||
|
||||
public PopupSelector(JTable table) {
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void popupMenuWillBecomeVisible(PopupMenuEvent popupMenuEvent) {
|
||||
JPopupMenu popupMenu = (JPopupMenu) popupMenuEvent.getSource();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(popupMenu, new Point(0, 0), table));
|
||||
if (rowAtPoint > -1) {
|
||||
table.setRowSelectionInterval(rowAtPoint, rowAtPoint);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void popupMenuWillBecomeInvisible(PopupMenuEvent popupMenuEvent) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void popupMenuCanceled(PopupMenuEvent popupMenuEvent) {
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package nl.andrewlalis.ui.control.listeners.management_view;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
/**
|
||||
* This abstract class defines listeners which listen to tables, that is, a table row is clicked on in the table, and
|
||||
* that is passed to children.
|
||||
*/
|
||||
public abstract class TableRowListener implements ActionListener {
|
||||
|
||||
/**
|
||||
* The table of which to get the row.
|
||||
*/
|
||||
private JTable table;
|
||||
|
||||
/**
|
||||
* Constructs a table row listener.
|
||||
* @param table The table on which to get selected rows.
|
||||
*/
|
||||
public TableRowListener(JTable table) {
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The selected row.
|
||||
*/
|
||||
protected final int getSelectedRow() {
|
||||
return this.table.getSelectedRow();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The table that this listener is attached to.
|
||||
*/
|
||||
protected final JTable getTable() {
|
||||
return this.table;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package nl.andrewlalis.ui.control.listeners.management_view.student_actions;
|
||||
|
||||
import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener;
|
||||
import nl.andrewlalis.ui.view.table_models.StudentTableModel;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
|
||||
/**
|
||||
* Listens for when the user intends to remove a selected student from the course entirely. This entails a few things:
|
||||
* 1. Remove them from any team they are in.
|
||||
* 2. Archive any repository that is empty as a result of removing them.
|
||||
* 3. Remove the student from the list of students.
|
||||
* (This should not actually remove the record, just set it as removed.)
|
||||
*/
|
||||
public class RemoveFromCourseListener extends TableRowListener {
|
||||
|
||||
public RemoveFromCourseListener(JTable table) {
|
||||
super(table);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
StudentTableModel model = (StudentTableModel) this.getTable().getModel();
|
||||
|
||||
System.out.println(model.getStudentAt(this.getSelectedRow()));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package nl.andrewlalis.ui.control.listeners.management_view.student_actions;
|
||||
|
||||
import nl.andrewlalis.model.Student;
|
||||
import nl.andrewlalis.model.StudentTeam;
|
||||
import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener;
|
||||
import nl.andrewlalis.ui.view.dialogs.TeamChooserDialog;
|
||||
import nl.andrewlalis.ui.view.table_models.StudentTableModel;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
|
||||
/**
|
||||
* Listens for when the user wishes to set the team of a certain student. This should do the following:
|
||||
* 1. User selects team to set student to, or chooses to create a new team.
|
||||
* 2. StudentTeam object is created or modified.
|
||||
* 3. The repository is updated automatically.
|
||||
*/
|
||||
public class SetTeamListener extends TableRowListener {
|
||||
|
||||
public SetTeamListener(JTable table) {
|
||||
super(table);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
StudentTableModel model = (StudentTableModel) this.getTable().getModel();
|
||||
Student student = model.getStudentAt(this.getSelectedRow());
|
||||
|
||||
StudentTeam chosenTeam = (StudentTeam) new TeamChooserDialog(SwingUtilities.getWindowAncestor(this.getTable())).getSelectedTeam();
|
||||
}
|
||||
}
|
|
@ -28,6 +28,11 @@ public abstract class AbstractView extends JFrame {
|
|||
*/
|
||||
private List<AbstractView> parentViews;
|
||||
|
||||
/**
|
||||
* The image icon for all abstract views.
|
||||
*/
|
||||
private static final ImageIcon imageIcon = new ImageIcon(AbstractView.class.getResource("/image/icon.png"));
|
||||
|
||||
/**
|
||||
* Initializes the view by packing the content pane as it is defined by any child, and setting some generic swing
|
||||
* values.
|
||||
|
@ -42,6 +47,7 @@ public abstract class AbstractView extends JFrame {
|
|||
this.githubManager = githubManager;
|
||||
this.childViews = new ArrayList<>();
|
||||
this.parentViews = new ArrayList<>();
|
||||
this.setIconImage(imageIcon.getImage());
|
||||
this.setContentPane(this.buildContentPane());
|
||||
this.setDefaultCloseOperation(defaultCloseOperation);
|
||||
if (preferredSize != null) {
|
||||
|
|
|
@ -3,6 +3,8 @@ package nl.andrewlalis.ui.view;
|
|||
import nl.andrewlalis.git_api.GithubManager;
|
||||
import nl.andrewlalis.model.database.DbHelper;
|
||||
import nl.andrewlalis.model.database.DbUtil;
|
||||
import nl.andrewlalis.ui.control.listeners.management_view.PopupSelector;
|
||||
import nl.andrewlalis.ui.control.listeners.management_view.student_actions.RemoveFromCourseListener;
|
||||
import nl.andrewlalis.ui.view.components.DetailPanel;
|
||||
import nl.andrewlalis.ui.view.table_models.StudentTableModel;
|
||||
import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel;
|
||||
|
@ -145,6 +147,13 @@ public class ManagementView extends AbstractView {
|
|||
table.getSelectionModel().addListSelectionListener(listSelectionEvent -> {
|
||||
detailPanel.setDetailableEntity(studentsModel.getStudentAt(table.getSelectedRow()));
|
||||
});
|
||||
JPopupMenu menu = new JPopupMenu("Menu");
|
||||
JMenuItem removeItem = new JMenuItem("Remove from course");
|
||||
removeItem.addActionListener(new RemoveFromCourseListener(table));
|
||||
menu.add(removeItem);
|
||||
menu.addPopupMenuListener(new PopupSelector(table));
|
||||
table.setComponentPopupMenu(menu);
|
||||
|
||||
return this.buildGenericTablePanel(table);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package nl.andrewlalis.ui.view.dialogs;
|
||||
|
||||
import nl.andrewlalis.model.Team;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
public class TeamChooserDialog extends JDialog {
|
||||
|
||||
public TeamChooserDialog(Window parent) {
|
||||
super(parent);
|
||||
}
|
||||
|
||||
public Team getSelectedTeam() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -21,7 +21,7 @@ public class StudentTeamTableModel extends AbstractTableModel {
|
|||
* The column headers for this model. In addition to these headers, this model will dynamically create headers for
|
||||
* each additional student to be listed in the table.
|
||||
*/
|
||||
private final String[] staticColumns = {"Number", "Member Count"};
|
||||
private final String[] staticColumns = {"Number", "Repository Name", "TA Team"};
|
||||
|
||||
/**
|
||||
* Dynamic columns which are generated depending on the teams.
|
||||
|
@ -90,7 +90,9 @@ public class StudentTeamTableModel extends AbstractTableModel {
|
|||
case 0:
|
||||
return team.getId();
|
||||
case 1:
|
||||
return team.memberCount();
|
||||
return (team.getRepositoryName() == null) ? "None" : team.getRepositoryName();
|
||||
case 2:
|
||||
return (team.getTaTeam() == null) ? "None" : team.getTaTeam().getDetailName();
|
||||
default:
|
||||
return this.getMemberInColumn(team, i1);
|
||||
}
|
||||
|
@ -135,8 +137,9 @@ public class StudentTeamTableModel extends AbstractTableModel {
|
|||
this.columns = new String[this.staticColumns.length + maxMembers];
|
||||
this.columns[0] = this.staticColumns[0];
|
||||
this.columns[1] = this.staticColumns[1];
|
||||
this.columns[2] = this.staticColumns[2];
|
||||
for (int i = 0; i < maxMembers; i++) {
|
||||
this.columns[i + 2] = "Member " + (i + 1);
|
||||
this.columns[i + this.staticColumns.length] = "Member " + (i + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue