my_students 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/my_students/version.rb +5 -0
- data/lib/my_students.rb +10 -0
- data/lib/source/controllers/student_contact_form_controller.rb +40 -0
- data/lib/source/controllers/student_create_form_controller.rb +48 -0
- data/lib/source/controllers/student_edit_form_controller.rb +45 -0
- data/lib/source/controllers/student_git_form_controller.rb +40 -0
- data/lib/source/controllers/student_list_controller.rb +112 -0
- data/lib/source/gui/logic_window.rb +187 -0
- data/lib/source/gui/main_window.rb +26 -0
- data/lib/source/gui/student_create_form.rb +70 -0
- data/lib/source/gui/test.rb +32 -0
- data/lib/source/logger/logger_holder.rb +23 -0
- data/lib/source/models/student.rb +163 -0
- data/lib/source/models/student_short.rb +56 -0
- data/lib/source/repositories/containers/data_list.rb +67 -0
- data/lib/source/repositories/containers/data_list_student_short.rb +18 -0
- data/lib/source/repositories/containers/data_table.rb +38 -0
- data/lib/source/repositories/data_sources/strategy/student_list_json.rb +16 -0
- data/lib/source/repositories/data_sources/strategy/student_list_txt.rb +39 -0
- data/lib/source/repositories/data_sources/strategy/student_list_yaml.rb +17 -0
- data/lib/source/repositories/data_sources/student_list_base.rb +91 -0
- data/lib/source/repositories/data_sources/student_list_strategy.rb +12 -0
- data/lib/source/repositories/db_university.rb +28 -0
- data/lib/source/repositories/student_list.rb +40 -0
- data/lib/source/repositories/student_list_db_adapter.rb +75 -0
- data/lib/source/repositories/student_list_file_adapter.rb +42 -0
- data/my_students.gemspec +17 -0
- data/sig/my_students.rbs +4 -0
- metadata +85 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: aa63632f6f00b17c12e1713c15457ee77bae2b4584f809388767b03122a95c9e
|
|
4
|
+
data.tar.gz: '09280c3129b0a11974388b772d18c38d561137eff9f791191b9b46ac86c96f03'
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: eeface5fc6af33d66668a0d9d53f76ba75ff90951223029edca841423e8196880a65d50a6cd21370a6d8a251aa2f9206e2f24c2e597493070aa9746428f64cc9
|
|
7
|
+
data.tar.gz: cafe7c5535f6dcbc2049f1893c9dcf66c5d0cf7ee52006669a943dee49158cd5d57e09de7da67ce70cd02eca3566357d7c06e617aaf39b582bcfce940afcc76b
|
data/lib/my_students.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class StudentContactFormController
|
|
4
|
+
def initialize(parent_controller, existing_student_id)
|
|
5
|
+
@parent_controller = parent_controller
|
|
6
|
+
@existing_student_id = existing_student_id
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def view=(view)
|
|
10
|
+
@view = view
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def on_view_created
|
|
14
|
+
@student_list = StudentList.new(StudentListDbAdapter.new)
|
|
15
|
+
@existing_student = @student_list.student_by_id(@existing_student_id)
|
|
16
|
+
@view.make_readonly(:first_name,:last_name,:paternal_name, :git)
|
|
17
|
+
set_fields(@existing_student)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def set_fields(student)
|
|
21
|
+
student = student
|
|
22
|
+
puts student
|
|
23
|
+
@view.set_value(:last_name, student.last_name)
|
|
24
|
+
@view.set_value(:first_name, student.first_name)
|
|
25
|
+
@view.set_value(:paternal_name, student.paternal_name)
|
|
26
|
+
@view.set_value(:git, student.git)
|
|
27
|
+
@view.set_value(:telegram, student.telegram)
|
|
28
|
+
@view.set_value(:email, student.email)
|
|
29
|
+
@view.set_value(:phone, student.phone)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def process_fields(fields)
|
|
34
|
+
new_student = Student.from_hash(fields)
|
|
35
|
+
|
|
36
|
+
@student_list.replace_student(@existing_student_id, new_student)
|
|
37
|
+
|
|
38
|
+
@view.close
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'sqlite3'
|
|
3
|
+
require_relative '../logger/logger_holder'
|
|
4
|
+
require_relative '../repositories/student_list'
|
|
5
|
+
require_relative '../repositories/student_list_db_adapter'
|
|
6
|
+
class StudentCreateFormController
|
|
7
|
+
def initialize(controller)
|
|
8
|
+
@controller = controller
|
|
9
|
+
LoggerHolder.instance.debug('StudentCreateFormController: initialized')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def on_view_created
|
|
13
|
+
begin
|
|
14
|
+
@student_rep = StudentList.new(StudentListDbAdapter.new)
|
|
15
|
+
rescue SQLException::SQLException => e
|
|
16
|
+
on_db_conn_error(e)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def view=(view)
|
|
21
|
+
@view = view
|
|
22
|
+
LoggerHolder.instance.debug('StudentCreateFormController: setter view')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def process_fields(fields)
|
|
26
|
+
last_name = fields.delete(:last_name)
|
|
27
|
+
first_name = fields.delete(:first_name)
|
|
28
|
+
paternal_name = fields.delete(:paternal_name)
|
|
29
|
+
|
|
30
|
+
# TODO написать пользователю что он не прав
|
|
31
|
+
return if last_name.nil? || first_name.nil? || paternal_name.nil?
|
|
32
|
+
|
|
33
|
+
student = Student.new(last_name, first_name, paternal_name, **fields)
|
|
34
|
+
|
|
35
|
+
@student_rep.add_student(student)
|
|
36
|
+
@view.close
|
|
37
|
+
@controller.view.refresh_current_page
|
|
38
|
+
LoggerHolder.instance.debug('StudentCreateFormController: add student')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def on_db_conn_error(e)
|
|
42
|
+
LoggerHolder.instance.debug('StudentCreateFormController: DB connection error:')
|
|
43
|
+
LoggerHolder.instance.error(error.message)
|
|
44
|
+
script = "display dialog \"Отсутсвует подключение к БД #{e.message}\" with title \"Ошибка\""
|
|
45
|
+
system 'osascript', '-e', script
|
|
46
|
+
exit(false)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require_relative '../logger/logger_holder'
|
|
3
|
+
class StudentEditFormController
|
|
4
|
+
def initialize(parent_controller, existing_student_id)
|
|
5
|
+
@parent_controller = parent_controller
|
|
6
|
+
@existing_student_id = existing_student_id
|
|
7
|
+
LoggerHolder.instance.debug('StudentEditFormController: initialized')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def view=(view)
|
|
11
|
+
@view = view
|
|
12
|
+
LoggerHolder.instance.debug('StudentEditFormController: view')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def on_view_created
|
|
16
|
+
@student_list = StudentList.new(StudentListDbAdapter.new)
|
|
17
|
+
@existing_student = @student_list.student_by_id(@existing_student_id)
|
|
18
|
+
@view.make_readonly(:git, :telegram, :email, :phone)
|
|
19
|
+
set_fields(@existing_student)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def set_fields(student)
|
|
23
|
+
student = student
|
|
24
|
+
puts student
|
|
25
|
+
@view.set_value(:last_name, student.last_name)
|
|
26
|
+
@view.set_value(:first_name, student.first_name)
|
|
27
|
+
@view.set_value(:paternal_name, student.paternal_name)
|
|
28
|
+
@view.set_value(:git, student.git)
|
|
29
|
+
@view.set_value(:telegram, student.telegram)
|
|
30
|
+
@view.set_value(:email, student.email)
|
|
31
|
+
@view.set_value(:phone, student.phone)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def process_fields(fields)
|
|
36
|
+
new_student = Student.from_hash(fields)
|
|
37
|
+
|
|
38
|
+
LoggerHolder.instance.debug('StudentEditFormController: replace student')
|
|
39
|
+
|
|
40
|
+
@student_list.replace_student(@existing_student_id, new_student)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@view.close
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class StudentGitFormController
|
|
4
|
+
def initialize(parent_controller, existing_student_id)
|
|
5
|
+
@parent_controller = parent_controller
|
|
6
|
+
@existing_student_id = existing_student_id
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def view=(view)
|
|
10
|
+
@view = view
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def on_view_created
|
|
14
|
+
@student_list = StudentList.new(StudentListDbAdapter.new)
|
|
15
|
+
@existing_student = @student_list.student_by_id(@existing_student_id)
|
|
16
|
+
@view.make_readonly(:first_name,:last_name,:paternal_name, :telegram, :email, :phone)
|
|
17
|
+
set_fields(@existing_student)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def set_fields(student)
|
|
21
|
+
student = student
|
|
22
|
+
puts student
|
|
23
|
+
@view.set_value(:last_name, student.last_name)
|
|
24
|
+
@view.set_value(:first_name, student.first_name)
|
|
25
|
+
@view.set_value(:paternal_name, student.paternal_name)
|
|
26
|
+
@view.set_value(:git, student.git)
|
|
27
|
+
@view.set_value(:telegram, student.telegram)
|
|
28
|
+
@view.set_value(:email, student.email)
|
|
29
|
+
@view.set_value(:phone, student.phone)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def process_fields(fields)
|
|
34
|
+
new_student = Student.from_hash(fields)
|
|
35
|
+
|
|
36
|
+
@student_list.replace_student(@existing_student_id, new_student)
|
|
37
|
+
|
|
38
|
+
@view.close
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
|
|
2
|
+
require_relative '../gui/main_window'
|
|
3
|
+
require_relative '../gui/logic_window'
|
|
4
|
+
require_relative '../repositories/student_list'
|
|
5
|
+
require_relative '../repositories/student_list_db_adapter'
|
|
6
|
+
require_relative '../repositories/student_list_file_adapter'
|
|
7
|
+
require_relative '../repositories/data_sources/strategy/student_list_json'
|
|
8
|
+
require_relative '../repositories/containers/data_list_student_short'
|
|
9
|
+
require_relative 'student_create_form_controller'
|
|
10
|
+
require_relative 'student_edit_form_controller'
|
|
11
|
+
require_relative 'student_git_form_controller'
|
|
12
|
+
require_relative 'student_contact_form_controller'
|
|
13
|
+
require_relative '../logger/logger_holder'
|
|
14
|
+
require 'glimmer-dsl-libui'
|
|
15
|
+
|
|
16
|
+
class StudentListController
|
|
17
|
+
|
|
18
|
+
attr_reader :view
|
|
19
|
+
def initialize(view)
|
|
20
|
+
LoggerHolder.instance.debug('StudentListController: init start')
|
|
21
|
+
@view = view
|
|
22
|
+
@data_list = DataListStudentShort.new([])
|
|
23
|
+
@data_list.add_observer(@view)
|
|
24
|
+
LoggerHolder.instance.debug('StudentListController: init done')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def on_view_created
|
|
28
|
+
#@student_list = StudentList.new(StudentListFileAdapter.new(StudentListJSON.new, './LabStudents/test_data/students.json'))
|
|
29
|
+
|
|
30
|
+
begin
|
|
31
|
+
@student_list=StudentList.new(StudentListDbAdapter.new)
|
|
32
|
+
LoggerHolder.instance.debug('StudentListController: view create')
|
|
33
|
+
rescue
|
|
34
|
+
on_db_conn_error
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def show_view
|
|
40
|
+
@view.create.show
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def show_add_student()
|
|
44
|
+
LoggerHolder.instance.debug('StudentListController: show add student')
|
|
45
|
+
controller = StudentCreateFormController.new(self)
|
|
46
|
+
view = StudentCreateForm.new(controller)
|
|
47
|
+
controller.view=view
|
|
48
|
+
view.create.show
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def show_edit_student(current_page, per_page, selected_row)
|
|
52
|
+
LoggerHolder.instance.debug('StudentListController: show edit name')
|
|
53
|
+
student_num = selected_row
|
|
54
|
+
@data_list.select_elem(student_num)
|
|
55
|
+
student_id = @data_list.selected_id
|
|
56
|
+
controller = StudentEditFormController.new(self, student_id)
|
|
57
|
+
view = StudentCreateForm.new(controller)
|
|
58
|
+
controller.view=view
|
|
59
|
+
view.create.show
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def show_git_student(current_page, per_page, selected_row)
|
|
63
|
+
LoggerHolder.instance.debug('StudentListController: show edit git')
|
|
64
|
+
student_num = selected_row
|
|
65
|
+
@data_list.select_elem(student_num)
|
|
66
|
+
student_id = @data_list.selected_id
|
|
67
|
+
controller = StudentGitFormController.new(self, student_id)
|
|
68
|
+
view = StudentCreateForm.new(controller)
|
|
69
|
+
controller.view=view
|
|
70
|
+
view.create.show
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def show_contact_student(current_page, per_page, selected_row)
|
|
74
|
+
LoggerHolder.instance.debug('StudentListController: show edit git')
|
|
75
|
+
student_num = selected_row
|
|
76
|
+
@data_list.select_elem(student_num)
|
|
77
|
+
student_id = @data_list.selected_id
|
|
78
|
+
controller = StudentContactFormController.new(self, student_id)
|
|
79
|
+
view = StudentCreateForm.new(controller)
|
|
80
|
+
controller.view=view
|
|
81
|
+
view.create.show
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def delete_selected(current_page, per_page, selected_row)
|
|
85
|
+
# begin
|
|
86
|
+
#student_num = (current_page - 1) * per_page + selected_row
|
|
87
|
+
student_num = selected_row
|
|
88
|
+
puts student_num
|
|
89
|
+
@data_list.select_elem(student_num)
|
|
90
|
+
student_id = @data_list.selected_id
|
|
91
|
+
@student_list.remove_student(student_id)
|
|
92
|
+
# rescue
|
|
93
|
+
# on_db_conn_error
|
|
94
|
+
# end
|
|
95
|
+
end
|
|
96
|
+
def refresh_data(k, n)
|
|
97
|
+
# begin
|
|
98
|
+
#raise StandardError, "Error DB"
|
|
99
|
+
@data_list = @student_list.k_n_student_short_list(k, n, @data_list)
|
|
100
|
+
@view.update_student_count(@student_list.student_count)
|
|
101
|
+
# rescue
|
|
102
|
+
# on_db_conn_error
|
|
103
|
+
# end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# разрыв соединения с бд
|
|
107
|
+
def on_db_conn_error
|
|
108
|
+
script = 'display dialog "Отсутсвует подключение к БД" with title "Ошибка"'
|
|
109
|
+
system 'osascript', '-e', script
|
|
110
|
+
exit(false)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require_relative '../controllers/student_list_controller'
|
|
3
|
+
require_relative '../repositories/containers/data_table'
|
|
4
|
+
require_relative 'student_create_form'
|
|
5
|
+
class LogicWindow
|
|
6
|
+
include Glimmer
|
|
7
|
+
|
|
8
|
+
STUDENTS_PER_PAGE = 10
|
|
9
|
+
|
|
10
|
+
def initialize
|
|
11
|
+
@controller = StudentListController.new(self)
|
|
12
|
+
@current_page = 1
|
|
13
|
+
@total_count = 0
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def on_create
|
|
17
|
+
@controller.on_view_created
|
|
18
|
+
@controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Метод наблюдателя datalist
|
|
22
|
+
def on_datalist_changed(new_table)
|
|
23
|
+
arr = new_table.to_my_array
|
|
24
|
+
arr.map do |row|
|
|
25
|
+
row[3] = row[3][:value] unless row[3].nil?
|
|
26
|
+
end
|
|
27
|
+
@table.model_array = arr
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def update_student_count(new_cnt)
|
|
31
|
+
@total_count = new_cnt
|
|
32
|
+
@page_label.text = "#{@current_page} / #{(@total_count / STUDENTS_PER_PAGE.to_f).ceil}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def create
|
|
36
|
+
root_container = horizontal_box {
|
|
37
|
+
|
|
38
|
+
# 1 область
|
|
39
|
+
vertical_box {
|
|
40
|
+
form {
|
|
41
|
+
stretchy false
|
|
42
|
+
|
|
43
|
+
@filter_last_name_initials = entry {
|
|
44
|
+
stretchy false
|
|
45
|
+
label 'Фамилия И. О.'
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@filters = {}
|
|
49
|
+
fields = [[:git, 'Гит'], [:email, 'Почта'], [:phone, 'Телефон'], [:telegram, 'Телеграм']]
|
|
50
|
+
|
|
51
|
+
fields.each do |field|
|
|
52
|
+
@filters[field[0]] = {}
|
|
53
|
+
|
|
54
|
+
@filters[field[0]][:combobox] = combobox {
|
|
55
|
+
stretchy false
|
|
56
|
+
label "#{field[1]} имеется?"
|
|
57
|
+
items ['Не важно', 'Да', 'Нет']
|
|
58
|
+
selected 0
|
|
59
|
+
|
|
60
|
+
on_selected do
|
|
61
|
+
if @filters[field[0]][:combobox].selected == 1
|
|
62
|
+
@filters[field[0]][:entry].read_only = false
|
|
63
|
+
else
|
|
64
|
+
@filters[field[0]][:entry].text = ''
|
|
65
|
+
@filters[field[0]][:entry].read_only = true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@filters[field[0]][:entry] = entry {
|
|
71
|
+
stretchy false
|
|
72
|
+
label field[1]
|
|
73
|
+
read_only true
|
|
74
|
+
}
|
|
75
|
+
end
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#2 область
|
|
80
|
+
vertical_box {
|
|
81
|
+
stretchy false
|
|
82
|
+
@table = refined_table(
|
|
83
|
+
table_editable: false,
|
|
84
|
+
filter: lambda do |row_hash, query|
|
|
85
|
+
utf8_query = query.force_encoding("utf-8")
|
|
86
|
+
row_hash['Фамилия И. О'].include?(utf8_query)
|
|
87
|
+
end,
|
|
88
|
+
table_columns: {
|
|
89
|
+
'#' => :text,
|
|
90
|
+
'Фамилия И. О' => :text,
|
|
91
|
+
'Гит' => :text,
|
|
92
|
+
'Контакт' => :text
|
|
93
|
+
},
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
@pages = horizontal_box {
|
|
97
|
+
stretchy false
|
|
98
|
+
|
|
99
|
+
button("<") {
|
|
100
|
+
stretchy true
|
|
101
|
+
|
|
102
|
+
on_clicked do
|
|
103
|
+
@current_page = [@current_page - 1, 1].max
|
|
104
|
+
@controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
@page_label = label("...") { stretchy false }
|
|
109
|
+
button(">") {
|
|
110
|
+
stretchy true
|
|
111
|
+
|
|
112
|
+
on_clicked do
|
|
113
|
+
@current_page = [@current_page + 1, (@total_count / STUDENTS_PER_PAGE.to_f).ceil].min
|
|
114
|
+
@controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
|
|
115
|
+
end
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
#3 область
|
|
121
|
+
vertical_box {
|
|
122
|
+
stretchy false
|
|
123
|
+
|
|
124
|
+
button('Добавить') {
|
|
125
|
+
stretchy false
|
|
126
|
+
|
|
127
|
+
on_clicked {
|
|
128
|
+
@controller.show_add_student
|
|
129
|
+
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
button('Изменить ФИО') {
|
|
134
|
+
stretchy false
|
|
135
|
+
|
|
136
|
+
on_clicked {
|
|
137
|
+
@controller.show_edit_student(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
|
|
138
|
+
} }
|
|
139
|
+
button('Изменить git') { stretchy false
|
|
140
|
+
on_clicked{
|
|
141
|
+
@controller.show_git_student(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
button('Изменить контакт') { stretchy false
|
|
145
|
+
on_clicked{
|
|
146
|
+
@controller.show_contact_student(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
button('Удалить') {
|
|
150
|
+
stretchy false
|
|
151
|
+
|
|
152
|
+
on_clicked {
|
|
153
|
+
@controller.delete_selected(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
|
|
154
|
+
@controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
button('Обновить') {
|
|
158
|
+
stretchy false
|
|
159
|
+
|
|
160
|
+
on_clicked {
|
|
161
|
+
@controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
on_create
|
|
167
|
+
root_container
|
|
168
|
+
end
|
|
169
|
+
def refresh_current_page
|
|
170
|
+
@controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
private
|
|
174
|
+
|
|
175
|
+
def sort_by_column(column_index)
|
|
176
|
+
data = @table.cell_rows
|
|
177
|
+
if @sort_column == column_index
|
|
178
|
+
data.reverse!
|
|
179
|
+
@sort_order = (@sort_order == :asc) ? :desc : :asc
|
|
180
|
+
else
|
|
181
|
+
@sort_column = column_index
|
|
182
|
+
@sort_order = :asc
|
|
183
|
+
data.sort_by! { |row| row[column_index].to_s }
|
|
184
|
+
end
|
|
185
|
+
@table.cell_rows = data
|
|
186
|
+
end
|
|
187
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'glimmer-dsl-libui'
|
|
4
|
+
require_relative 'logic_window'
|
|
5
|
+
|
|
6
|
+
class MainWindow
|
|
7
|
+
include Glimmer
|
|
8
|
+
|
|
9
|
+
def initialize
|
|
10
|
+
@logic_tab = LogicWindow.new
|
|
11
|
+
end
|
|
12
|
+
def create
|
|
13
|
+
window('Универ', 1200, 700) {
|
|
14
|
+
margined true
|
|
15
|
+
tab {
|
|
16
|
+
tab_item('Студенты') {
|
|
17
|
+
|
|
18
|
+
@logic_tab.create
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
tab_item('Вкладка 2') { }
|
|
22
|
+
tab_item('Вкладка 3') { }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'glimmer-dsl-libui'
|
|
4
|
+
require_relative '../controllers/student_create_form_controller'
|
|
5
|
+
require_relative '../models/student'
|
|
6
|
+
|
|
7
|
+
class StudentCreateForm
|
|
8
|
+
include Glimmer
|
|
9
|
+
puts "hello"
|
|
10
|
+
|
|
11
|
+
def initialize(controller, existing_student = nil)
|
|
12
|
+
@existing_student = existing_student.to_hash unless existing_student.nil?
|
|
13
|
+
@controller = controller
|
|
14
|
+
@entries = {}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def on_create
|
|
18
|
+
@controller.on_view_created
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def create
|
|
22
|
+
@root_container = window('Универ', 300, 200) {
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
vertical_box {
|
|
26
|
+
@student_form = form {
|
|
27
|
+
stretchy false
|
|
28
|
+
|
|
29
|
+
fields = [[:last_name, 'Фамилия', false], [:first_name, 'Имя', false], [:paternal_name, 'Отчество', false], [:git, 'Гит', true], [:telegram, 'Телеграм', true], [:email, 'Почта', true], [:phone, 'Телефон', true]]
|
|
30
|
+
|
|
31
|
+
fields.each do |field|
|
|
32
|
+
@entries[field[0]] = entry {
|
|
33
|
+
label field[1]
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
button('Сохранить') {
|
|
40
|
+
stretchy false
|
|
41
|
+
|
|
42
|
+
on_clicked {
|
|
43
|
+
values = @entries.transform_values { |v| v.text.force_encoding("utf-8").strip }
|
|
44
|
+
values.transform_values! { |v| v.empty? ? nil : v}
|
|
45
|
+
|
|
46
|
+
@controller.process_fields(values)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
on_create
|
|
53
|
+
@root_container
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def set_value(field, value)
|
|
57
|
+
return unless @entries.include?(field)
|
|
58
|
+
@entries[field].text = value
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def make_readonly(*fields)
|
|
62
|
+
fields.each do |field|
|
|
63
|
+
@entries[field].read_only = true
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def close
|
|
68
|
+
@root_container.destroy
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'glimmer-dsl-libui'
|
|
2
|
+
|
|
3
|
+
include Glimmer
|
|
4
|
+
|
|
5
|
+
data = [
|
|
6
|
+
['task 1', 0],
|
|
7
|
+
['task 2', 15],
|
|
8
|
+
['task 3', 100],
|
|
9
|
+
['task 4', 75],
|
|
10
|
+
['task 5', -1],
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
window('Task Progress', 300, 200) {
|
|
14
|
+
vertical_box {
|
|
15
|
+
table {
|
|
16
|
+
text_column('Task')
|
|
17
|
+
progress_bar_column('Progress')
|
|
18
|
+
|
|
19
|
+
cell_rows data
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
button('Mark All As Done') {
|
|
23
|
+
stretchy false
|
|
24
|
+
|
|
25
|
+
on_clicked do
|
|
26
|
+
data.each_with_index do |row_data, row|
|
|
27
|
+
data[row][1] = 100
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}.show
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
require 'logger'
|
|
3
|
+
|
|
4
|
+
class LoggerHolder
|
|
5
|
+
private_class_method :new
|
|
6
|
+
@instance_mutex = Mutex.new
|
|
7
|
+
|
|
8
|
+
attr_reader :logger
|
|
9
|
+
|
|
10
|
+
def initialize
|
|
11
|
+
@logger = Logger.new(STDOUT)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.instance
|
|
15
|
+
return @instance.logger if @instance
|
|
16
|
+
|
|
17
|
+
@instance_mutex.synchronize do
|
|
18
|
+
@instance ||= new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
@instance.logger
|
|
22
|
+
end
|
|
23
|
+
end
|