Class: Student_list_presenter

Inherits:
Base_presenter show all
Defined in:
lib/presenters/base_presenters/student_list_presenter.rb

Overview

Student_list_presenter

Презентер для управления списком студентов. Отвечает за логику отображения, фильтрации и сортировки данных о студентах.

Instance Method Summary collapse

Constructor Details

#initialize(view) ⇒ Student_list_presenter

Инициализация презентера списка студентов. Настраивает список студентов, фильтры и порядок сортировки.

Parameters:

  • view (Base_view_interface)

    Представление, отображающее список студентов.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 27

def initialize(view)
  super(view)
  self.logger.debug("Инициализация Student_list_presenter")
  begin
    self.logger.debug("Инициализация Students_list")
    self.entities_list = Students_list.new(Students_list_DB.new)
    # self.entities_list = Students_list.new(Students_list_file_adapter.new(Students_list_file.new('./students.json', JSON_storage_strategy.new)))
    self.logger.debug("Инициализация Data_list_student_short")
    self.data_list = Data_list_student_short.new([])
    self.filters = Filter.new
    self.sort_order = {
      order: :asc,
      col_index: 0
    }
  rescue StandardError => e
    error_msg = "Ошибка при получении доступа к файлу: #{e.message}"
    self.logger.error(error_msg)
    self.view.show_error(error_msg)
  end
end

Instance Method Details

#add_student(student) ⇒ Object

Добавление нового студента.

Parameters:

  • student (Student)

    Объект студента для добавления.



72
73
74
75
76
77
78
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 72

def add_student(student)
  self.logger.info "Добавление студента в хранилище"
  self.logger.debug "Данные студента: #{student.to_line_s}"
  self.entities_list.add_student(student)
  self.logger.info "Студент добавлен в хранилище"
  self.refresh_data
end

#apply_filtersObject

Применение фильтров.



175
176
177
178
179
180
181
182
183
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 175

def apply_filters
  self.logger.info "Установка фильтров"
  self.apply_full_name_filter
  self.apply_git_filter
  self.apply_email_filter
  self.apply_phone_number_filter
  self.apply_telegram_filter
  self.apply_sort
end

#check_and_update_pageObject

Проверка и, если нужно, смена страницы в таблице. Используется после удаления студента.



155
156
157
158
159
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 155

def check_and_update_page()
  if self.view.current_page > self.view.total_pages
    switch_page(-1)
  end
end

#delete_studentObject

Удаление выбранных студентов в таблице студентов.



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 136

def delete_student
  ids = self.get_selected
  begin
    ids.each do |id|
      self.logger.info "Удаление студента с id: #{id}"
      self.entities_list.delete_student(id)
    end
  rescue => e
    error_msg = "Ошибка при удалении: #{e.message}"
    self.logger.error error_msg
    self.view.show_error(error_msg)
  ensure
    self.refresh_data
    self.check_and_update_page
  end
end

#deselect(number) ⇒ Object

Удаление выделения строки таблицы.

Parameters:

  • number (Integer)

    Индекс строки для удаления выбора.



96
97
98
99
100
101
102
103
104
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 96

def deselect(number)
  begin
    self.data_list.deselect(number)
    self.logger.info "Выделение со строки: #{number} убрано"
    self.view.update_button_states
  rescue
    self.logger.error "Ошибка при удалении выделения строки: #{number}"
  end
end

#get_selectedArray<Integer>

Получение списка ID выбранных студентов.

Returns:

  • (Array<Integer>)

    Список ID выбранных студентов.



109
110
111
112
113
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 109

def get_selected
  selected = self.data_list.get_selected
  self.logger.debug "Выделенные студенты: #{selected}"
  selected
end

#get_student(id) ⇒ Student

Получение объекта студента по ID.

Returns:

  • (Student)

    Объект студента.



118
119
120
121
122
123
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 118

def get_student(id)
  self.logger.info "Получение студента по id: #{id}"
  student = self.entities_list.get_student_by_id(id)
  self.logger.debug "Студент: #{student.to_line_s}"
  student
end

#refresh_dataObject

Обновление данных в таблице студентов. Выполняет сброс фильтров, применяет новые фильтры и обновляет представление.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 50

def refresh_data
  self.logger.info "Обновление таблицы студентов"
  self.data_list.clear_selected
  self.reset_filters
  self.apply_filters
  begin
    self.logger.info "Поиск студентов в хранилище"
    self.data_list = self.entities_list.get_k_n_student_short_list(self.view.current_page, self.view.rows_per_page, self.filters, self.data_list)
    self.data_list.count = self.entities_list.get_student_short_count
    self.view.update_view({ columns: self.data_list.get_names, total_count: self.data_list.count, table_data: self.data_list.retrieve_data })
  rescue => e
    error_msg = "Ошибка при получении данных: #{e.message}"
    self.logger.error error_msg
    self.view.show_error(error_msg)
  end
  
  self.logger.info "Таблица студентов обновлена"
end

#replace_student(student) ⇒ Object

Изменение студента.

Parameters:

  • student (Student)

    Объект студента для изменения.



128
129
130
131
132
133
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 128

def replace_student(student)
  self.logger.info "Замена студента с id: #{student.id}"
  self.logger.debug "Замена студента: #{student.to_line_s}"
  self.entities_list.replace_student(student.id, student)
  self.refresh_data
end

#reset_filtersObject

Сброс фильтров



186
187
188
189
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 186

def reset_filters
  self.logger.info "Сброс фильтров"
  self.filters = Filter.new
end

#select(number) ⇒ Object

Выбор строки таблицы.

Parameters:

  • number (Integer)

    Индекс строки для выбора.



83
84
85
86
87
88
89
90
91
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 83

def select(number)
  begin
    self.data_list.select(number)
    self.logger.info "Выделена строка: #{number}"
    self.view.update_button_states
  rescue
    self.logger.error "Ошибка при выделении строки: #{number}"
  end
end

#set_sort_order(column_index) ⇒ Object

Установка порядка сортировки и сортировка данных в таблице.

@param column_index [Integer] Индекс столбца, по которому выполняется сортировка.


194
195
196
197
198
199
200
201
202
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 194

def set_sort_order(column_index)
  if self.sort_order[:col_index] == column_index
    self.sort_order[:order] = self.sort_order[:order] == :asc ? :desc : :asc 
  else
    self.sort_order[:col_index] = column_index
    self.sort_order[:order] = :asc
  end
  self.refresh_data
end

#switch_page(direction) ⇒ Object

Изменение текущей страницы в таблице.

Parameters:

  • direction (Integer)

    Направление для изменения страницы.



164
165
166
167
168
169
170
171
172
# File 'lib/presenters/base_presenters/student_list_presenter.rb', line 164

def switch_page(direction)
  new_page = self.view.current_page + direction
  if new_page < 1 || new_page > self.view.total_pages
    return
  end
  self.logger.info "Переключение страницы на: #{new_page}"
  self.view.current_page = new_page
  self.refresh_data
end