/
evernotenkai
/
DataBaseXJavaProject
Обзор
Документация
Войти
/
evernotenkai
/
DataBaseXJavaProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/app/ui/admin/AdminCoursesView.java
213 строк
9 KB
Makson4ik
Весь проект с src db и прочим делом
12 май 2026, 22:43
12 май 2026, 22:43
431f4aa
Код
Авторство
О чём код?
package app.ui.admin; import java.util.List; import app.model.CourseItem; import app.model.TeacherItem; import app.service.AdminService; import app.ui.components.PageHeader; import app.ui.components.UiKit; import app.util.Dialogs; import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; public class AdminCoursesView extends VBox { private final AdminService service; private final ObservableList<CourseItem> items = FXCollections.observableArrayList(); private final FilteredList<CourseItem> filtered = new FilteredList<CourseItem>(items, p -> true); private final TableView<CourseItem> table = new TableView<CourseItem>(); private final TextField search = new TextField(); private final ObservableList<TeacherItem> teachers = FXCollections.observableArrayList(); private final ComboBox<TeacherItem> teacherBox = new ComboBox<TeacherItem>(teachers); private final TextField name = new TextField(); private final TextArea description = new TextArea(); public AdminCoursesView(final AdminService service) { this.service = service; getStyleClass().add("content-root"); setSpacing(16); getChildren().add(new PageHeader("Курсы", "Создание курса, фильтры по названию и преподавателю, быстрые правки без ручного поиска.")); UiKit.configureTable(table); TableColumn<CourseItem, String> c1 = new TableColumn<CourseItem, String>("Название"); c1.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getName())); TableColumn<CourseItem, String> c2 = new TableColumn<CourseItem, String>("Преподаватель"); c2.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getTeacherName())); TableColumn<CourseItem, String> c3 = new TableColumn<CourseItem, String>("Описание"); c3.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getDescription())); table.getColumns().addAll(c1, c2, c3); table.setItems(filtered); search.setPromptText("Поиск по курсу или преподавателю"); search.textProperty().addListener((obs, old, value) -> filtered.setPredicate(item -> matches(item, value))); Button reset = UiKit.ghostButton("Сбросить"); reset.setOnAction(e -> search.clear()); HBox filterRow = new HBox(10, search, reset); HBox.setHgrow(search, Priority.ALWAYS); teacherBox.setPromptText("Преподаватель"); description.setPrefRowCount(6); name.setPromptText("Название курса"); description.setPromptText("Краткое описание дисциплины"); VBox form = UiKit.card( UiKit.section("Карточка курса"), UiKit.fieldBox("Название курса", name, "Например: Базы данных"), UiKit.fieldBox("Описание", description, "Краткое описание дисциплины"), UiKit.fieldBox("Преподаватель", teacherBox, "Выбери ответственного преподавателя"), buttonRow(UiKit.primaryButton("Создать"), UiKit.secondaryButton("Сохранить"), UiKit.dangerButton("Удалить"), UiKit.ghostButton("Очистить")) ); final HBox buttons = (HBox) form.getChildren().get(form.getChildren().size() - 1); final Button create = (Button) buttons.getChildren().get(0); final Button update = (Button) buttons.getChildren().get(1); final Button delete = (Button) buttons.getChildren().get(2); final Button clear = (Button) buttons.getChildren().get(3); table.getSelectionModel().selectedItemProperty().addListener((obs, old, sel) -> { if (sel == null) return; name.setText(sel.getName()); description.setText(sel.getDescription()); selectTeacherById(sel.getTeacherId()); }); create.setOnAction(e -> { try { TeacherItem teacher = teacherBox.getValue(); if (teacher == null) { Dialogs.info("Курсы", "Сначала выбери преподавателя."); return; } service.createCourse(name.getText(), description.getText(), teacher.getTeacherId()); refresh(); clear(name, description, teacherBox, table); } catch (Exception ex) { Dialogs.error("Ошибка создания курса", ex); } }); update.setOnAction(e -> { try { CourseItem sel = table.getSelectionModel().getSelectedItem(); TeacherItem teacher = teacherBox.getValue(); if (sel == null || teacher == null) { Dialogs.info("Курсы", "Выбери курс и преподавателя."); return; } service.updateCourse(sel.getId(), name.getText(), description.getText(), teacher.getTeacherId()); refresh(); } catch (Exception ex) { Dialogs.error("Ошибка обновления курса", ex); } }); delete.setOnAction(e -> { try { CourseItem sel = table.getSelectionModel().getSelectedItem(); if (sel == null) { Dialogs.info("Курсы", "Выбери курс в таблице."); return; } if (Dialogs.confirm("Удаление", "Удалить курс \"" + sel.getName() + "\"?")) { service.deleteCourse(sel.getId()); refresh(); clear(name, description, teacherBox, table); } } catch (Exception ex) { Dialogs.error("Ошибка удаления курса", ex); } }); clear.setOnAction(e -> clear(name, description, teacherBox, table)); BorderPane layout = new BorderPane(); layout.setTop(UiKit.card(UiKit.section("Поиск и фильтры"), filterRow)); layout.setLeft(UiKit.card(UiKit.section("Список курсов"), table)); layout.setRight(form); BorderPane.setMargin(form, new Insets(0, 0, 0, 16)); BorderPane.setMargin(table, new Insets(0, 16, 0, 0)); HBox.setHgrow(layout, Priority.ALWAYS); getChildren().add(layout); refresh(); } public void refresh() { CourseItem current = table.getSelectionModel().getSelectedItem(); List<CourseItem> newCourses = service.findCourses(); items.setAll(newCourses); filtered.setPredicate(item -> matches(item, search.getText())); loadTeachers(); if (current != null) { for (CourseItem c : newCourses) { if (c.getId() == current.getId()) { table.getSelectionModel().select(c); break; } } } if (current == null && !newCourses.isEmpty()) { table.getSelectionModel().select(0); } } private void loadTeachers() { TeacherItem current = teacherBox.getValue(); teachers.setAll(service.findTeachers()); if (current != null) { for (TeacherItem t : teachers) { if (t.getTeacherId() == current.getTeacherId()) { teacherBox.getSelectionModel().select(t); return; } } } } private void selectTeacherById(int teacherId) { for (TeacherItem t : teachers) { if (t.getTeacherId() == teacherId) { teacherBox.getSelectionModel().select(t); return; } } } private boolean matches(CourseItem item, String query) { String q = query == null ? "" : query.trim().toLowerCase(); if (q.isEmpty()) return true; return contains(item.getName(), q) || contains(item.getTeacherName(), q) || contains(item.getDescription(), q); } private boolean contains(String value, String q) { return value != null && value.toLowerCase().contains(q); } private HBox buttonRow(Button... buttons) { HBox box = new HBox(10, buttons); box.setAlignment(Pos.CENTER_LEFT); return box; } private void clear(TextField name, TextArea description, ComboBox<TeacherItem> teacherBox, TableView<CourseItem> table) { name.clear(); description.clear(); teacherBox.getSelectionModel().clearSelection(); table.getSelectionModel().clearSelection(); } }