diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..4e7f670 --- /dev/null +++ b/.classpath @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..1ec79ca --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + management-system + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + + + 1770804693954 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..abdea9a --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..e96c048 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=21 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/college.db b/college.db index 29d0dc7..a88525e 100644 Binary files a/college.db and b/college.db differ diff --git a/src/main/java/com/college/management/AdminDashboard.java b/src/main/java/com/college/management/AdminDashboard.java index e894116..29197dd 100644 --- a/src/main/java/com/college/management/AdminDashboard.java +++ b/src/main/java/com/college/management/AdminDashboard.java @@ -118,29 +118,63 @@ public class AdminDashboard { root.setCenter(content); } + public static void loadEventsIntoList(ListView listView) { + try (Connection conn = DatabaseManager.getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT title, description, event_date FROM events ORDER BY event_date ASC")) { + while (rs.next()) { + listView.getItems().add(rs.getString("event_date") + " - " + rs.getString("title") + "\n" + rs.getString("description")); + } + } catch (SQLException e) { e.printStackTrace(); } + } + private void showEventManagement(BorderPane root) { VBox content = new VBox(15); content.setPadding(new Insets(20)); - Label title = new Label("Manage Events"); + Label title = new Label("College Events"); title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;"); - TextField txtTitle = new TextField(); txtTitle.setPromptText("Event Title"); - DatePicker datePicker = new DatePicker(); - TextArea txtDesc = new TextArea(); txtDesc.setPromptText("Event Description"); - Button btnAdd = new Button("Add Event"); + ListView listView = new ListView<>(); + loadEventsIntoList(listView); - btnAdd.setOnAction(e -> { - try (Connection conn = DatabaseManager.getConnection(); - PreparedStatement pstmt = conn.prepareStatement("INSERT INTO events (title, description, event_date) VALUES (?, ?, ?)")) { - pstmt.setString(1, txtTitle.getText()); - pstmt.setString(2, txtDesc.getText()); - pstmt.setString(3, datePicker.getValue().toString()); - pstmt.executeUpdate(); - new Alert(Alert.AlertType.INFORMATION, "Event added!").show(); - } catch (SQLException ex) { ex.printStackTrace(); } + Button btnShowForm = new Button("Create New Event"); + btnShowForm.setStyle("-fx-background-color: #128c7e; -fx-text-fill: white; -fx-font-weight: bold;"); + + btnShowForm.setOnAction(e -> { + // Creation Form + VBox form = new VBox(10); + form.setPadding(new Insets(10)); + form.setStyle("-fx-border-color: #dcdcdc; -fx-border-radius: 5; -fx-padding: 15;"); + + TextField txtTitle = new TextField(); txtTitle.setPromptText("Event Title"); + DatePicker datePicker = new DatePicker(); + TextArea txtDesc = new TextArea(); txtDesc.setPromptText("Event Description"); + + HBox actions = new HBox(10); + Button btnSave = new Button("Post Event"); + Button btnCancel = new Button("Cancel"); + actions.getChildren().addAll(btnSave, btnCancel); + + btnSave.setOnAction(ev -> { + if (txtTitle.getText().isEmpty() || datePicker.getValue() == null) return; + try (Connection conn = DatabaseManager.getConnection(); + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO events (title, description, event_date) VALUES (?, ?, ?)")) { + pstmt.setString(1, txtTitle.getText()); + pstmt.setString(2, txtDesc.getText()); + pstmt.setString(3, datePicker.getValue().toString()); + pstmt.executeUpdate(); + new Alert(Alert.AlertType.INFORMATION, "Event added!").show(); + showEventManagement(root); // Refresh view + } catch (SQLException ex) { ex.printStackTrace(); } + }); + + btnCancel.setOnAction(ev -> content.getChildren().remove(form)); + + form.getChildren().addAll(new Label("New Event Details"), txtTitle, datePicker, txtDesc, actions); + content.getChildren().add(form); }); - content.getChildren().addAll(title, txtTitle, datePicker, txtDesc, btnAdd); + content.getChildren().addAll(title, listView, btnShowForm); root.setCenter(content); } @@ -226,6 +260,42 @@ public class AdminDashboard { root.setCenter(content); } + public static void loadNoticesIntoList(ListView listView) { + try (Connection conn = DatabaseManager.getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery( + "SELECT n.title, n.content, n.date, u.role " + + "FROM notices n " + + "LEFT JOIN users u ON n.posted_by = u.id " + + "ORDER BY n.id DESC")) { + while (rs.next()) { + String role = rs.getString("role"); + String prefix = "ADMIN".equals(role) ? "[PRIORITY] " : ""; + String notice = prefix + rs.getString("date") + " - " + rs.getString("title") + "\n" + rs.getString("content"); + listView.getItems().add(notice); + } + } catch (SQLException e) { e.printStackTrace(); } + + // Custom cell factory for highlighting + listView.setCellFactory(lv -> new ListCell() { + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + if (empty || item == null) { + setText(null); + setStyle(""); + } else { + setText(item); + if (item.startsWith("[PRIORITY]")) { + setStyle("-fx-font-weight: bold; -fx-text-fill: #d32f2f;"); // Red bold for priority + } else { + setStyle(""); + } + } + } + }); + } + private void showNoticeManagement(BorderPane root) { VBox content = new VBox(15); content.setPadding(new Insets(20)); @@ -242,10 +312,11 @@ public class AdminDashboard { btnPost.setOnAction(e -> { if (txtTitle.getText().isEmpty() || txtContent.getText().isEmpty()) return; try (Connection conn = DatabaseManager.getConnection(); - PreparedStatement pstmt = conn.prepareStatement("INSERT INTO notices (title, content, date) VALUES (?, ?, ?)")) { + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO notices (title, content, date, posted_by) VALUES (?, ?, ?, ?)")) { pstmt.setString(1, txtTitle.getText()); pstmt.setString(2, txtContent.getText()); pstmt.setString(3, java.time.LocalDate.now().toString()); + pstmt.setInt(4, userId); pstmt.executeUpdate(); txtTitle.clear(); txtContent.clear(); diff --git a/src/main/java/com/college/management/FacultyDashboard.java b/src/main/java/com/college/management/FacultyDashboard.java index 6f8bc6e..da5cb0a 100644 --- a/src/main/java/com/college/management/FacultyDashboard.java +++ b/src/main/java/com/college/management/FacultyDashboard.java @@ -37,12 +37,13 @@ public class FacultyDashboard { Button btnMarks = createSidebarButton("Marks Entry"); Button btnTimetable = createSidebarButton("My Timetable"); Button btnEvents = createSidebarButton("Events"); + Button btnNotices = createSidebarButton("Notices"); Button btnChat = createSidebarButton("Global Chat"); Button btnPrivateChat = createSidebarButton("Private Chat"); Button btnSettings = createSidebarButton("Settings"); Button btnLogout = createSidebarButton("Logout"); - sidebar.getChildren().addAll(brand, new Separator(), btnAttendance, btnMarks, btnTimetable, btnEvents, btnChat, btnPrivateChat, btnSettings, btnLogout); + sidebar.getChildren().addAll(brand, new Separator(), btnAttendance, btnMarks, btnTimetable, btnEvents, btnNotices, btnChat, btnPrivateChat, btnSettings, btnLogout); root.setLeft(sidebar); applyTheme(root); @@ -52,6 +53,7 @@ public class FacultyDashboard { btnMarks.setOnAction(e -> showMarksEntry(root)); btnTimetable.setOnAction(e -> showTimetable(root)); btnEvents.setOnAction(e -> showEvents(root)); + btnNotices.setOnAction(e -> showNotices(root)); btnChat.setOnAction(e -> AdminDashboard.showChat(root, username, userId)); btnPrivateChat.setOnAction(e -> root.setCenter(new PrivateChatUI(userId).getView())); btnSettings.setOnAction(e -> root.setCenter(new SettingsUI(userId, () -> applyTheme(root)).getView())); @@ -62,6 +64,68 @@ public class FacultyDashboard { stage.setScene(scene); } + private void showEvents(BorderPane root) { + VBox content = new VBox(15); + content.setPadding(new Insets(20)); + Label title = new Label("College Events"); + title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;"); + + ListView listView = new ListView<>(); + AdminDashboard.loadEventsIntoList(listView); + + Button btnShowForm = new Button("Create New Event"); + btnShowForm.setStyle("-fx-background-color: #128c7e; -fx-text-fill: white; -fx-font-weight: bold;"); + + btnShowForm.setOnAction(e -> { + VBox form = new VBox(10); + form.setPadding(new Insets(15)); + form.setStyle("-fx-border-color: #dcdcdc; -fx-border-radius: 5;"); + + TextField txtTitle = new TextField(); txtTitle.setPromptText("Event Title"); + DatePicker datePicker = new DatePicker(); + TextArea txtDesc = new TextArea(); txtDesc.setPromptText("Event Description"); + + HBox actions = new HBox(10); + Button btnSave = new Button("Post Event"); + Button btnCancel = new Button("Cancel"); + actions.getChildren().addAll(btnSave, btnCancel); + + btnSave.setOnAction(ev -> { + if (txtTitle.getText().isEmpty() || datePicker.getValue() == null) return; + try (Connection conn = DatabaseManager.getConnection(); + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO events (title, description, event_date) VALUES (?, ?, ?)")) { + pstmt.setString(1, txtTitle.getText()); + pstmt.setString(2, txtDesc.getText()); + pstmt.setString(3, datePicker.getValue().toString()); + pstmt.executeUpdate(); + new Alert(Alert.AlertType.INFORMATION, "Event added!").show(); + showEvents(root); + } catch (SQLException ex) { ex.printStackTrace(); } + }); + + btnCancel.setOnAction(ev -> content.getChildren().remove(form)); + + form.getChildren().addAll(new Label("New Event Details"), txtTitle, datePicker, txtDesc, actions); + content.getChildren().add(form); + }); + + content.getChildren().addAll(title, listView, btnShowForm); + root.setCenter(content); + } + + private void showNotices(BorderPane root) { + VBox content = new VBox(15); + content.setPadding(new Insets(20)); + Label title = new Label("College Notices"); + title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;"); + + ListView listView = new ListView<>(); + AdminDashboard.loadNoticesIntoList(listView); + + content.getChildren().addAll(title, listView); + root.setCenter(content); + } + private void applyTheme(BorderPane root) { root.getStylesheets().clear(); root.getStylesheets().add(getClass().getResource("/com/college/management/css/chat.css").toExternalForm()); @@ -86,25 +150,6 @@ public class FacultyDashboard { root.setCenter(content); } - private void showEvents(BorderPane root) { - VBox content = new VBox(15); - content.setPadding(new Insets(20)); - Label title = new Label("Upcoming Events"); - title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;"); - - ListView listView = new ListView<>(); - try (Connection conn = DatabaseManager.getConnection(); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT title, description, event_date FROM events ORDER BY event_date ASC")) { - while (rs.next()) { - listView.getItems().add(rs.getString("event_date") + " - " + rs.getString("title") + "\n" + rs.getString("description")); - } - } catch (SQLException e) { e.printStackTrace(); } - - content.getChildren().addAll(title, listView); - root.setCenter(content); - } - private void setupTimetableTable(TableView table) { TableColumn colDay = new TableColumn<>("Day"); colDay.setCellValueFactory(new PropertyValueFactory<>("day")); diff --git a/src/main/java/com/college/management/StudentDashboard.java b/src/main/java/com/college/management/StudentDashboard.java index 320c1d9..5f1b50e 100644 --- a/src/main/java/com/college/management/StudentDashboard.java +++ b/src/main/java/com/college/management/StudentDashboard.java @@ -120,13 +120,7 @@ public class StudentDashboard { title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;"); ListView listView = new ListView<>(); - try (Connection conn = DatabaseManager.getConnection(); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT title, description, event_date FROM events ORDER BY event_date ASC")) { - while (rs.next()) { - listView.getItems().add(rs.getString("event_date") + " - " + rs.getString("title") + "\n" + rs.getString("description")); - } - } catch (SQLException e) { e.printStackTrace(); } + AdminDashboard.loadEventsIntoList(listView); content.getChildren().addAll(title, listView); root.setCenter(content); @@ -199,13 +193,7 @@ public class StudentDashboard { title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;"); ListView listView = new ListView<>(); - try (Connection conn = DatabaseManager.getConnection(); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT title, content, date FROM notices ORDER BY id DESC")) { - while (rs.next()) { - listView.getItems().add(rs.getString("date") + " - " + rs.getString("title") + "\n" + rs.getString("content")); - } - } catch (SQLException e) { e.printStackTrace(); } + AdminDashboard.loadNoticesIntoList(listView); content.getChildren().addAll(title, listView); root.setCenter(content); diff --git a/target/classes/com/college/management/AdminDashboard$1.class b/target/classes/com/college/management/AdminDashboard$1.class new file mode 100644 index 0000000..1814ac3 Binary files /dev/null and b/target/classes/com/college/management/AdminDashboard$1.class differ diff --git a/target/classes/com/college/management/AdminDashboard$TableValue.class b/target/classes/com/college/management/AdminDashboard$TableValue.class index d3cfec1..273f28e 100644 Binary files a/target/classes/com/college/management/AdminDashboard$TableValue.class and b/target/classes/com/college/management/AdminDashboard$TableValue.class differ diff --git a/target/classes/com/college/management/AdminDashboard.class b/target/classes/com/college/management/AdminDashboard.class index b494cec..3ab231b 100644 Binary files a/target/classes/com/college/management/AdminDashboard.class and b/target/classes/com/college/management/AdminDashboard.class differ diff --git a/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class b/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class index 6a92c3b..f59c32f 100644 Binary files a/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class and b/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class differ diff --git a/target/classes/com/college/management/FacultyDashboard.class b/target/classes/com/college/management/FacultyDashboard.class index 3345808..d4886d7 100644 Binary files a/target/classes/com/college/management/FacultyDashboard.class and b/target/classes/com/college/management/FacultyDashboard.class differ diff --git a/target/classes/com/college/management/StudentDashboard$MarkRecord.class b/target/classes/com/college/management/StudentDashboard$MarkRecord.class index ff64d50..868e9aa 100644 Binary files a/target/classes/com/college/management/StudentDashboard$MarkRecord.class and b/target/classes/com/college/management/StudentDashboard$MarkRecord.class differ diff --git a/target/classes/com/college/management/StudentDashboard.class b/target/classes/com/college/management/StudentDashboard.class index c370ef9..24c37b7 100644 Binary files a/target/classes/com/college/management/StudentDashboard.class and b/target/classes/com/college/management/StudentDashboard.class differ diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index f426395..8737c83 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -10,6 +10,7 @@ com/college/management/App.class com/college/management/PrivateChatUI$1.class com/college/management/ChatService.class com/college/management/User.class +com/college/management/AdminDashboard$1.class com/college/management/FacultyDashboard$TimetableEntry.class com/college/management/StudentDashboard$MarkRecord.class com/college/management/ChatMessage.class