/
evernotenkai
/
DataBaseXJavaProject
Обзор
Документация
Войти
/
evernotenkai
/
DataBaseXJavaProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/app/ui/teacher/TeacherCoursePlannerView.java
250 строк
11 KB
Makson4ik
Весь проект с src db и прочим делом
12 май 2026, 22:43
12 май 2026, 22:43
431f4aa
Код
Авторство
О чём код?
package app.ui.teacher; import java.time.LocalDate; import java.util.List; import app.model.AssignmentItem; import app.model.CourseItem; import app.service.LmsService; 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.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.DatePicker; import javafx.scene.control.Label; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.control.SplitPane; import javafx.scene.layout.VBox; public class TeacherCoursePlannerView extends VBox { private final LmsService service; private final int teacherId; private final Runnable onChanged; private final ObservableList<AssignmentItem> items = FXCollections.observableArrayList(); private final ComboBox<CourseItem> courseBox = new ComboBox<CourseItem>(); private final TableView<AssignmentItem> table = new TableView<AssignmentItem>(); private final TextField titleField = new TextField(); private final TextArea descriptionField = new TextArea(); private final DatePicker duePicker = new DatePicker(); private final DatePicker createdPicker = new DatePicker(); private final Label selectedMeta = UiKit.labeled("Выбери курс и задание, чтобы отредактировать данные", "muted-text"); public TeacherCoursePlannerView(final LmsService service, final int teacherId) { this(service, teacherId, null); } public TeacherCoursePlannerView(final LmsService service, final int teacherId, Runnable onChanged) { this.service = service; this.teacherId = teacherId; this.onChanged = onChanged; getStyleClass().add("content-root"); setSpacing(16); getChildren().add(new PageHeader("Курсы и задания", "Список твоих курсов и редактор заданий в одном месте.")); courseBox.setPromptText("Выберите курс"); courseBox.getItems().setAll(service.findTeacherCourses(teacherId)); UiKit.configureTable(table); TableColumn<AssignmentItem, String> c1 = new TableColumn<AssignmentItem, String>("Название"); c1.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getTitle())); TableColumn<AssignmentItem, String> c2 = new TableColumn<AssignmentItem, String>("Срок"); c2.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getDueDate())); TableColumn<AssignmentItem, String> c3 = new TableColumn<AssignmentItem, String>("Создано"); c3.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getCreatedAt())); table.getColumns().addAll(c1, c2, c3); descriptionField.setPrefRowCount(7); VBox.setVgrow(table, Priority.ALWAYS); VBox left = UiKit.card( UiKit.section("Мои курсы"), UiKit.subtitle("Выбери курс, чтобы увидеть список заданий и назначенные сроки."), courseBox, selectedMeta, table ); VBox formBody = UiKit.card( UiKit.section("Карточка задания"), UiKit.subtitle("Все поля редактируются без ручного ввода ID."), UiKit.fieldBox("Название", titleField, "Краткое название лабораторной или практики"), UiKit.fieldBox("Описание", descriptionField, "Подробные требования к выполнению"), UiKit.fieldBox("Срок сдачи", duePicker, "Формат даты задается календарём"), UiKit.fieldBox("Дата создания", createdPicker, "Когда задание опубликовано"), actionRow() ); SplitPane split = new SplitPane(left, formBody); split.getStyleClass().add("workspace-split-pane"); split.setDividerPositions(0.54); split.widthProperty().addListener((obs, oldW, newW) -> split.setDividerPositions(newW.doubleValue() < 1240 ? 0.50 : 0.54)); SplitPane.setResizableWithParent(left, true); SplitPane.setResizableWithParent(formBody, true); HBox.setHgrow(split, Priority.ALWAYS); getChildren().add(split); courseBox.valueProperty().addListener((obs, oldV, newV) -> reloadAssignments()); table.getSelectionModel().selectedItemProperty().addListener((obs, old, selected) -> { fillFromSelection(selected); }); if (!courseBox.getItems().isEmpty()) { courseBox.getSelectionModel().select(0); } refresh(); } private HBox actionRow() { Button add = UiKit.primaryButton("Создать"); Button update = UiKit.secondaryButton("Сохранить изменения"); Button delete = UiKit.dangerButton("Удалить"); Button clear = UiKit.ghostButton("Очистить"); HBox actions = new HBox(10, add, update, delete, clear); actions.setAlignment(Pos.CENTER_LEFT); actions.getStyleClass().add("toolbar"); add.setOnAction(e -> { try { CourseItem course = courseBox.getValue(); if (course == null) { Dialogs.info("Задания", "Сначала выбери курс."); return; } if (titleField.getText() == null || titleField.getText().trim().isEmpty()) { Dialogs.info("Задания", "Укажи название задания."); return; } if (duePicker.getValue() == null) { Dialogs.info("Задания", "Укажи срок сдачи."); return; } LocalDate created = createdPicker.getValue() == null ? LocalDate.now() : createdPicker.getValue(); service.createAssignment(course.getId(), titleField.getText().trim(), descriptionField.getText(), duePicker.getValue().toString(), created.toString()); refresh(); clearForm(); notifyChanged(); } catch (Exception ex) { Dialogs.error("Ошибка создания задания", ex); } }); update.setOnAction(e -> { try { AssignmentItem selected = table.getSelectionModel().getSelectedItem(); if (selected == null) { Dialogs.info("Задания", "Выбери задание в таблице."); return; } if (titleField.getText() == null || titleField.getText().trim().isEmpty()) { Dialogs.info("Задания", "Укажи название задания."); return; } if (duePicker.getValue() == null) { Dialogs.info("Задания", "Укажи срок сдачи."); return; } service.updateAssignment(selected.getId(), titleField.getText().trim(), descriptionField.getText(), duePicker.getValue().toString(), createdPicker.getValue() == null ? null : createdPicker.getValue().toString()); refresh(); notifyChanged(); } catch (Exception ex) { Dialogs.error("Ошибка обновления задания", ex); } }); delete.setOnAction(e -> { try { AssignmentItem selected = table.getSelectionModel().getSelectedItem(); if (selected == null) { Dialogs.info("Задания", "Выбери задание в таблице."); return; } if (Dialogs.confirm("Удаление", "Удалить задание \"" + selected.getTitle() + "\"?")) { service.deleteAssignment(selected.getId()); refresh(); clearForm(); notifyChanged(); } } catch (Exception ex) { Dialogs.error("Ошибка удаления задания", ex); } }); clear.setOnAction(e -> clearForm()); return actions; } private void fillFromSelection(AssignmentItem selected) { if (selected == null) { clearForm(); return; } titleField.setText(selected.getTitle()); descriptionField.setText(selected.getDescription()); duePicker.setValue(LocalDate.parse(selected.getDueDate())); createdPicker.setValue(LocalDate.parse(selected.getCreatedAt())); selectedMeta.setText(selected.getCourseName() + " • ID " + selected.getId()); } private void clearForm() { titleField.clear(); descriptionField.clear(); duePicker.setValue(null); createdPicker.setValue(null); table.getSelectionModel().clearSelection(); selectedMeta.setText("Выбери курс и задание, чтобы отредактировать данные"); } private void reloadAssignments() { items.clear(); CourseItem course = courseBox.getValue(); if (course != null) { items.addAll(service.findAssignmentsForCourse(course.getId())); } table.setItems(items); clearForm(); } public void refresh() { List<CourseItem> courses = service.findTeacherCourses(teacherId); CourseItem current = courseBox.getValue(); courseBox.getItems().setAll(courses); if (current != null) { for (CourseItem item : courses) { if (item.getId() == current.getId()) { courseBox.getSelectionModel().select(item); break; } } } if (courseBox.getValue() == null && !courses.isEmpty()) { courseBox.getSelectionModel().select(0); } reloadAssignments(); } private void notifyChanged() { if (onChanged != null) { onChanged.run(); } } }