papaSquidLib 0.1.0

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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +9 -0
  3. data/Gemfile.lock +69 -0
  4. data/lib/controllers/tab_students_controller.rb +43 -0
  5. data/lib/data_sources/db_client.rb +35 -0
  6. data/lib/db_config/config.yaml +5 -0
  7. data/lib/db_config/library_config.yaml +5 -0
  8. data/lib/db_config/migrations/create_db.sql +3 -0
  9. data/lib/db_config/migrations/create_tables.sql +29 -0
  10. data/lib/db_config/mock_data/mock_data.sql +72 -0
  11. data/lib/logger.rb +27 -0
  12. data/lib/main.rb +6 -0
  13. data/lib/manager/controllers/manager_input_form_controller_create.rb +44 -0
  14. data/lib/manager/controllers/manager_input_form_controller_edit.rb +54 -0
  15. data/lib/manager/controllers/manager_list_controller.rb +99 -0
  16. data/lib/manager/manager_db_data_source.rb +63 -0
  17. data/lib/manager/ui/manager_input_form.rb +69 -0
  18. data/lib/manager/ui/manager_list_view.rb +168 -0
  19. data/lib/models/manager.rb +41 -0
  20. data/lib/models/student.rb +102 -0
  21. data/lib/models/student_base.rb +100 -0
  22. data/lib/models/student_short.rb +50 -0
  23. data/lib/models/task.rb +49 -0
  24. data/lib/models/user.rb +32 -0
  25. data/lib/papaSquidLib/version.rb +5 -0
  26. data/lib/papa_squid_lib.rb +6 -0
  27. data/lib/repositories/adapters/db_source_adapter.rb +54 -0
  28. data/lib/repositories/adapters/file_source_adapter.rb +37 -0
  29. data/lib/repositories/containers/data_list.rb +74 -0
  30. data/lib/repositories/containers/data_list_student_short.rb +18 -0
  31. data/lib/repositories/containers/data_table.rb +35 -0
  32. data/lib/repositories/data_sources/db_data_source.rb +32 -0
  33. data/lib/repositories/data_sources/file_data_source.rb +75 -0
  34. data/lib/repositories/data_sources/transformers/data_transformer_base.rb +15 -0
  35. data/lib/repositories/data_sources/transformers/data_transformer_json.rb +16 -0
  36. data/lib/repositories/data_sources/transformers/data_transformer_yaml.rb +16 -0
  37. data/lib/repositories/student_repository.rb +32 -0
  38. data/lib/state_holders/list_state_notifier.rb +60 -0
  39. data/lib/task/controllers/task_input_form_controller_create.rb +43 -0
  40. data/lib/task/controllers/task_input_form_controller_edit.rb +57 -0
  41. data/lib/task/controllers/task_list_controller.rb +93 -0
  42. data/lib/task/task_db_data_source.rb +85 -0
  43. data/lib/task/ui/task_input_form.rb +67 -0
  44. data/lib/task/ui/task_input_form_factory.rb +26 -0
  45. data/lib/task/ui/task_list_view.rb +163 -0
  46. data/lib/user/controllers/user_input_form_controller_create.rb +42 -0
  47. data/lib/user/controllers/user_input_form_controller_edit.rb +53 -0
  48. data/lib/user/controllers/user_list_controller.rb +99 -0
  49. data/lib/user/ui/user_input_form.rb +69 -0
  50. data/lib/user/ui/user_list_view.rb +170 -0
  51. data/lib/user/user_db_data_source.rb +71 -0
  52. data/lib/views/main_window.rb +32 -0
  53. data/lib/views/tab_students.rb +148 -0
  54. data/papaSquidLib.gemspec +15 -0
  55. data/test/manager_test.rb +27 -0
  56. data/test/state_notifier_test.rb +82 -0
  57. data/test/task_test.rb +51 -0
  58. data/test/user_test.rb +39 -0
  59. metadata +113 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cad16365981700922f17bf8ec9e8186dd17a8f30218ec4f7f4f4341da2be25fc
4
+ data.tar.gz: 8ce2133014554d6b33b30240746f99765a5e2675493bf0311dbcc582be65d690
5
+ SHA512:
6
+ metadata.gz: 64ab150d1b69ba4b4b4d915c1b0ec0d012dbf66f918eead19fd02577f0494a336030f46ae80024006b8dc1db17e54876151bb9b22a10aac5d25674c66315b757
7
+ data.tar.gz: 22d41306cb4e6662a3426c93b815bbd9eb28d34217548e0866dbf846f1baf79057ed30262af39083fe1d5a2168cb8f5eae82299139e4a7b4c017398e0cc9d620
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "mysql2"
6
+ gem "glimmer-dsl-libui", "~> 0.7.4"
7
+ gem 'win32api'
8
+ gem "minitest"
9
+ gem 'rubocop', group: 'development'
data/Gemfile.lock ADDED
@@ -0,0 +1,69 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ array_include_methods (1.4.0)
5
+ ast (2.4.2)
6
+ chunky_png (1.4.0)
7
+ color (1.8)
8
+ equalizer (0.0.11)
9
+ facets (3.1.0)
10
+ glimmer (2.7.3)
11
+ array_include_methods (~> 1.4.0)
12
+ facets (>= 3.1.0, < 4.0.0)
13
+ glimmer-dsl-libui (0.7.4)
14
+ chunky_png (~> 1.4.0)
15
+ color (~> 1.8)
16
+ equalizer (= 0.0.11)
17
+ glimmer (~> 2.7.3)
18
+ libui (~> 0.1.2.pre)
19
+ os (>= 1.0.0, < 2.0.0)
20
+ perfect-shape (~> 1.0.7)
21
+ rouge (>= 3.26.0, < 4.0.0)
22
+ super_module (~> 1.4.1)
23
+ json (2.6.3)
24
+ libui (0.1.2.pre-x64-mingw)
25
+ matrix (0.4.2)
26
+ method_source (1.0.0)
27
+ minitest (5.16.3)
28
+ mysql2 (0.5.5)
29
+ os (1.1.4)
30
+ parallel (1.22.1)
31
+ parser (3.2.2.0)
32
+ ast (~> 2.4.1)
33
+ perfect-shape (1.0.7)
34
+ equalizer (>= 0.0.11, < 1.1.0)
35
+ matrix (>= 0.4.2, < 1.1.0)
36
+ rainbow (3.1.1)
37
+ regexp_parser (2.7.0)
38
+ rexml (3.2.5)
39
+ rouge (3.30.0)
40
+ rubocop (1.50.1)
41
+ json (~> 2.3)
42
+ parallel (~> 1.10)
43
+ parser (>= 3.2.0.0)
44
+ rainbow (>= 2.2.2, < 4.0)
45
+ regexp_parser (>= 1.8, < 3.0)
46
+ rexml (>= 3.2.5, < 4.0)
47
+ rubocop-ast (>= 1.28.0, < 2.0)
48
+ ruby-progressbar (~> 1.7)
49
+ unicode-display_width (>= 2.4.0, < 3.0)
50
+ rubocop-ast (1.28.0)
51
+ parser (>= 3.2.1.0)
52
+ ruby-progressbar (1.13.0)
53
+ super_module (1.4.1)
54
+ method_source (>= 0.8.2, < 1.1.0)
55
+ unicode-display_width (2.4.2)
56
+ win32api (0.1.0)
57
+
58
+ PLATFORMS
59
+ x64-mingw-ucrt
60
+
61
+ DEPENDENCIES
62
+ glimmer-dsl-libui (~> 0.7.4)
63
+ minitest
64
+ mysql2
65
+ rubocop
66
+ win32api
67
+
68
+ BUNDLED WITH
69
+ 2.4.10
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './lib/views/main_window'
4
+ require './lib/repositories/student_repository'
5
+ require './lib/repositories/adapters/db_source_adapter'
6
+ require './lib/repositories/containers/data_list_student_short'
7
+ require 'win32api'
8
+
9
+ class TabStudentsController
10
+ def initialize(view)
11
+ @view = view
12
+ @data_list = DataListStudentShort.new([])
13
+ @data_list.add_listener(@view)
14
+ end
15
+
16
+ def on_view_created
17
+ begin
18
+ @student_rep = StudentRepository.new(DBSourceAdapter.new)
19
+ rescue Mysql2::Error::ConnectionError
20
+ on_db_conn_error
21
+ end
22
+ end
23
+
24
+ def show_view
25
+ @view.create.show
26
+ end
27
+
28
+ def refresh_data(page, per_page)
29
+ begin
30
+ @data_list = @student_rep.paginated_short_students(page, per_page, @data_list)
31
+ @view.update_student_count(@student_rep.student_count)
32
+ rescue
33
+ on_db_conn_error
34
+ end
35
+ end
36
+
37
+ def on_db_conn_error
38
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
39
+ api.call(0, "No connection to DB", "Error", 0)
40
+ # TODO: Возможность переключения на JSON помимо exit
41
+ exit(false)
42
+ end
43
+ end
@@ -0,0 +1,35 @@
1
+ require 'mysql2'
2
+
3
+ class DBClient
4
+ private_class_method :new
5
+ @instance_mutex = Mutex.new
6
+
7
+ def initialize
8
+ db_config = YAML.load_file('./lib/db_config/library_config.yaml').transform_keys(&:to_sym)
9
+ @client = Mysql2::Client.new(db_config)
10
+ @client.query_options.merge!(symbolize_keys: true)
11
+ end
12
+
13
+ def self.instance
14
+ return @instance if @instance
15
+
16
+ @instance_mutex.synchronize do
17
+ @instance ||= new
18
+ end
19
+
20
+ @instance
21
+ end
22
+
23
+ def prepare_exec(statement, *params)
24
+ @client.prepare(statement).execute(*params)
25
+ end
26
+
27
+ def query(statement)
28
+ print statement
29
+ @client.query(statement)
30
+ end
31
+
32
+ def last_id
33
+ @client.last_id
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ host: 'localhost'
2
+ port: 3306
3
+ username: 'dimas'
4
+ password: 'qwe123'
5
+ database: 'ToDo'
@@ -0,0 +1,5 @@
1
+ host: 'localhost'
2
+ port: 3306
3
+ username: 'dimas'
4
+ password: 'qwe123'
5
+ database: 'ToDo'
@@ -0,0 +1,3 @@
1
+ DROP DATABASE ToDo;
2
+
3
+ CREATE DATABASE ToDo;
@@ -0,0 +1,29 @@
1
+ USE ToDo;
2
+
3
+ -- Table 1: User
4
+ CREATE TABLE User (
5
+ UserID INT PRIMARY KEY AUTO_INCREMENT,
6
+ FirstName VARCHAR(50) NOT NULL,
7
+ LastName VARCHAR(50) NOT NULL,
8
+ FatherName VARCHAR(50)
9
+ );
10
+ -- Table 2: Managers
11
+ CREATE TABLE Manager (
12
+ ManagerID INT PRIMARY KEY AUTO_INCREMENT,
13
+ Name VARCHAR(50) NOT NULL,
14
+ Email VARCHAR(255),
15
+ Phone VARCHAR(20) NOT NULL
16
+ );
17
+ -- Table 3: Tasks
18
+ CREATE TABLE Task (
19
+ TaskID INT PRIMARY KEY AUTO_INCREMENT,
20
+ UserID INT NOT NULL,
21
+ ManagerID INT NOT NULL,
22
+ Completed VARCHAR(10) NOT NULL CHECK (Completed IN ('Done', 'Undone', 'Process')),
23
+ Description TEXT,
24
+ Date DATE NOT NULL,
25
+ FOREIGN KEY (UserID) REFERENCES User (UserID),
26
+ FOREIGN KEY (ManagerID) REFERENCES Manager (ManagerID)
27
+ );
28
+
29
+
@@ -0,0 +1,72 @@
1
+ USE todo;
2
+
3
+ -- Insert 30 users
4
+ INSERT INTO User (FirstName, LastName, FatherName)
5
+ VALUES ('John', 'Smith', 'David'),
6
+ ('Jane', 'Doe', 'Michael'),
7
+ ('Michael', 'Johnson', 'Robert'),
8
+ ('Emily', 'Davis', 'James'),
9
+ ('David', 'Wilson', 'Andrew'),
10
+ ('Sarah', 'Anderson', 'Thomas'),
11
+ ('Robert', 'Thompson', 'Daniel'),
12
+ ('Jennifer', 'Brown', 'Matthew'),
13
+ ('William', 'Davis', 'Richard'),
14
+ ('Jessica', 'Miller', 'William'),
15
+ ('Daniel', 'Anderson', 'Steven'),
16
+ ('Laura', 'Wilson', 'Christopher'),
17
+ ('Mark', 'Taylor', 'Joseph'),
18
+ ('Julia', 'Thomas', 'Edward'),
19
+ ('Andrew', 'Moore', 'Brian'),
20
+ ('Stephanie', 'Martin', 'Anthony'),
21
+ ('Ryan', 'White', 'Paul'),
22
+ ('Rebecca', 'Lee', 'George'),
23
+ ('Timothy', 'Harris', 'Kevin'),
24
+ ('Natalie', 'Clark', 'Jason'),
25
+ ('Patrick', 'Lewis', 'Peter'),
26
+ ('Karen', 'Young', 'Benjamin'),
27
+ ('Edward', 'Walker', 'Scott'),
28
+ ('Michelle', 'Wright', 'Kenneth'),
29
+ ('Peter', 'Green', 'Daniel'),
30
+ ('Samantha', 'Allen', 'Alexander'),
31
+ ('Eric', 'Turner', 'Jonathan'),
32
+ ('Amy', 'Hill', 'Gregory'),
33
+ ('Steven', 'Cook', 'Nicholas'),
34
+ ('Rachel', 'Baker', 'Brandon');
35
+
36
+
37
+ -- Insert 10 publishers
38
+ INSERT INTO Manager (Name, Email, Phone)
39
+ VALUES ('John Smith', 'john@example.com', '89054037700'),
40
+ ('Jane Doe', 'jane@example.com', '89054037701'),
41
+ ('Michael Johnson', 'michael@example.com', '89054037702'),
42
+ ('Emily Davis', 'emily@example.com', '89054037703'),
43
+ ('David Wilson', 'david@example.com', '89054037704'),
44
+ ('Sarah Anderson', 'sarah@example.com', '89054037705'),
45
+ ('Robert Thompson', 'robert@example.com', '89054037706'),
46
+ ('Jennifer Brown', 'jennifer@example.com', '89054037707'),
47
+ ('William Davis', 'william@example.com', '89054037708'),
48
+ ('Jessica Miller', 'jessica@example.com', '89054037709');
49
+
50
+ -- Получение случайного UserID
51
+ SET @user_id = (SELECT UserID FROM User ORDER BY RAND() LIMIT 1);
52
+
53
+ -- Получение случайного ManagerID
54
+ SET @manager_id = (SELECT ManagerID FROM Manager ORDER BY RAND() LIMIT 1);
55
+
56
+ -- Вставка 15 записей
57
+ INSERT INTO Task (UserID, ManagerID, Completed, Description, Date)
58
+ VALUES (@user_id, @manager_id, 'Done', 'Complete task A', '2023-05-01'),
59
+ (@user_id, @manager_id, 'Undone', 'Incomplete task B', '2023-05-02'),
60
+ (@user_id, @manager_id, 'Process', 'Task in progress C', '2023-05-03'),
61
+ (@user_id, @manager_id, 'Done', 'Complete task D', '2023-05-04'),
62
+ (@user_id, @manager_id, 'Undone', 'Incomplete task E', '2023-05-05'),
63
+ (@user_id, @manager_id, 'Process', 'Task in progress F', '2023-05-06'),
64
+ (@user_id, @manager_id, 'Done', 'Complete task G', '2023-05-07'),
65
+ (@user_id, @manager_id, 'Undone', 'Incomplete task H', '2023-05-08'),
66
+ (@user_id, @manager_id, 'Process', 'Task in progress I', '2023-05-09'),
67
+ (@user_id, @manager_id, 'Done', 'Complete task J', '2023-05-10'),
68
+ (@user_id, @manager_id, 'Undone', 'Incomplete task K', '2023-05-11'),
69
+ (@user_id, @manager_id, 'Process', 'Task in progress L', '2023-05-12'),
70
+ (@user_id, @manager_id, 'Done', 'Complete task M', '2023-05-13'),
71
+ (@user_id, @manager_id, 'Undone', 'Incomplete task N', '2023-05-14'),
72
+ (@user_id, @manager_id, 'Process', 'Task in progress O', '2023-05-15');
data/lib/logger.rb ADDED
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ ##
6
+ # Обертка для хранения объекта Logger
7
+
8
+ class LoggerHolder
9
+ private_class_method :new
10
+ @instance_mutex = Mutex.new
11
+
12
+ attr_reader :logger
13
+
14
+ def initialize
15
+ @logger = Logger.new(STDOUT)
16
+ end
17
+
18
+ def self.instance
19
+ return @instance.logger if @instance
20
+
21
+ @instance_mutex.synchronize do
22
+ @instance ||= new
23
+ end
24
+
25
+ @instance.logger
26
+ end
27
+ end
data/lib/main.rb ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'logger'
4
+ require_relative 'views/main_window'
5
+ LoggerHolder.instance.level = Logger::DEBUG
6
+ MainWindow.new.create.show
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'win32api'
4
+
5
+ class ManagerInputFormControllerCreate
6
+ def initialize(parent_controller)
7
+ @parent_controller = parent_controller
8
+ @task_rep = ManagerDbDataSource.new
9
+ end
10
+
11
+ def set_view(view)
12
+ @view = view
13
+ end
14
+
15
+ def on_view_created
16
+ # begin
17
+ # @student_rep = StudentRepository.new(DBSourceAdapter.new)
18
+ # rescue Mysql2::Error::ConnectionError
19
+ # on_db_conn_error
20
+ # end
21
+ end
22
+
23
+ def process_fields(fields)
24
+ begin
25
+ puts fields
26
+ item = Manager.new(-1, *fields.values)
27
+ puts item
28
+ item = @task_rep.add(item)
29
+ @parent_controller.state_notifier.add(item)
30
+ @view.close
31
+ rescue ArgumentError => e
32
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
33
+ api.call(0, e.message, 'Error', 0)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def on_db_conn_error
40
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
41
+ api.call(0, "No connection to DB", "Error", 0)
42
+ @view.close
43
+ end
44
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'win32api'
4
+
5
+ class ManagerInputFormControllerEdit
6
+ def initialize(parent_controller, item)
7
+ @parent_controller = parent_controller
8
+ @item = item
9
+ @task_rep = ManagerDbDataSource.new
10
+ end
11
+
12
+ def set_view(view)
13
+ @view = view
14
+ end
15
+
16
+ def on_view_created
17
+ # begin
18
+ # @student_rep = StudentRepository.new(DBSourceAdapter.new)
19
+ # rescue Mysql2::Error::ConnectionError
20
+ # on_db_conn_error
21
+ # end
22
+
23
+ # @item = @author_rep.get(@item_id)
24
+ # @view.make_readonly(:git, :telegram, :email, :phone)
25
+ populate_fields(@item)
26
+ end
27
+
28
+ def populate_fields(item)
29
+ @view.set_value(:name, item.name)
30
+ @view.set_value(:email, item.email)
31
+ @view.set_value(:phone, item.phone)
32
+ end
33
+
34
+ def process_fields(fields)
35
+ print fields
36
+ begin
37
+ item = Manager.new(@item.id, *fields.values)
38
+ item = @task_rep.change(item)
39
+ @parent_controller.state_notifier.replace(@item, item)
40
+ @view.close
41
+ rescue ArgumentError => e
42
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
43
+ api.call(0, e.message, 'Error', 0)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def on_db_conn_error
50
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
51
+ api.call(0, "No connection to DB", "Error", 0)
52
+ @view.close
53
+ end
54
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './lib/state_holders/list_state_notifier'
4
+ require_relative '../ui/manager_input_form'
5
+ require_relative 'manager_input_form_controller_create.rb'
6
+ require_relative 'manager_input_form_controller_edit'
7
+ require_relative '../manager_db_data_source'
8
+ require 'win32api'
9
+
10
+ class ManagerListController
11
+
12
+ attr_reader :state_notifier
13
+ def initialize(view)
14
+ @view = view
15
+ @state_notifier = ListStateNotifier.new
16
+ @state_notifier.add_listener(@view)
17
+ @task_rep = ManagerDbDataSource.new
18
+
19
+ @sort_columns = %w[ManagerID Name Email Phone]
20
+ @sort_by = @sort_columns.first
21
+
22
+ @email_filter_columns = [nil, true, false]
23
+ @email_filter = @email_filter_columns.first
24
+ end
25
+
26
+
27
+
28
+ def on_view_created
29
+ # begin
30
+ # @student_rep = StudentRepository.new(DBSourceAdapter.new)
31
+ # rescue Mysql2::Error::ConnectionError
32
+ # on_db_conn_error
33
+ # end
34
+ end
35
+
36
+ def show_view
37
+ @view.create.show
38
+ end
39
+
40
+ def show_modal_add
41
+ controller = ManagerInputFormControllerCreate.new(self)
42
+ view = ManagerInputForm.new(controller)
43
+ controller.set_view(view)
44
+ view.create.show
45
+ end
46
+
47
+ def show_modal_edit(current_page, per_page, selected_row)
48
+ # item_num = (current_page - 1) * per_page + selected_row
49
+
50
+ item = @state_notifier.get(selected_row)
51
+
52
+ controller = ManagerInputFormControllerEdit.new(self, item)
53
+ view = ManagerInputForm.new(controller)
54
+ controller.set_view(view)
55
+ view.create.show
56
+ end
57
+
58
+ def delete_selected(current_page, per_page, selected_row)
59
+ begin
60
+ item = @state_notifier.get(selected_row)
61
+ @task_rep.delete(item.id)
62
+ @state_notifier.delete(item)
63
+ rescue
64
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
65
+ api.call(0, "You cannot delete the user because he is associated with some book", "Error", 0)
66
+ end
67
+ end
68
+
69
+ def refresh_data(page, per_page)
70
+ # begin
71
+ # @data_list = @student_rep.paginated_short_students(page, per_page, @data_list)
72
+ # @view.update_student_count(@student_rep.student_count)
73
+ # rescue
74
+ # on_db_conn_error
75
+ # end
76
+ items = @task_rep.get_list(per_page, page, @sort_by, 'ASC', @email_filter)
77
+ @state_notifier.set_all(items)
78
+ @view.update_student_count(@task_rep.count)
79
+ end
80
+
81
+ def sort(page, per_page, sort_index)
82
+ @sort_by = @sort_columns[sort_index]
83
+ refresh_data(page, per_page)
84
+ end
85
+
86
+ def filter_email(page, per_page, filter_index)
87
+ @email_filter = @email_filter_columns[filter_index]
88
+ refresh_data(page, per_page)
89
+ end
90
+
91
+
92
+ private
93
+
94
+ def on_db_conn_error
95
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
96
+ api.call(0, "No connection to DB", "Error", 0)
97
+ exit(false)
98
+ end
99
+ end
@@ -0,0 +1,63 @@
1
+ require 'mysql2'
2
+ require_relative '../data_sources/db_client'
3
+ require_relative '../models/manager'
4
+
5
+ class ManagerDbDataSource
6
+ def initialize
7
+ @client = DBClient.instance
8
+ end
9
+
10
+ def add(manager)
11
+ query = "INSERT INTO Manager (Name, Email, Phone) VALUES ('#{manager.name}', #{manager.email.nil? ? 'NULL' : "'#{manager.email}'"}, #{manager.phone.nil? ? 'NULL' : "'#{manager.phone}'"})"
12
+ @client.query(query)
13
+ manager_id = @client.last_id
14
+ get(manager_id)
15
+ end
16
+
17
+ def change(manager)
18
+ query = "UPDATE Manager SET Name='#{manager.name}', Email=#{manager.email.nil? ? 'NULL' : "'#{manager.email}'"}, Phone=#{manager.phone.nil? ? 'NULL' : "'#{manager.phone}'"} WHERE ManagerID=#{manager.id}"
19
+ @client.query(query)
20
+ get(manager.id)
21
+ end
22
+
23
+ def delete(id)
24
+ query = "DELETE FROM Manager WHERE ManagerID=#{id}"
25
+ @client.query(query)
26
+ end
27
+
28
+ def get(id)
29
+ query = "SELECT * FROM Manager WHERE ManagerID=#{id}"
30
+ result = @client.query(query).first
31
+ if result
32
+ Manager.new(result[:'ManagerID'], result[:'Name'], result[:'Email'], result[:'Phone'])
33
+ else
34
+ nil
35
+ end
36
+ end
37
+
38
+ def get_list(page_size, page_num, sort_field, sort_direction, has_email = nil)
39
+ offset = (page_num - 1) * page_size
40
+ query = "SELECT * FROM Manager"
41
+
42
+ if has_email == true
43
+ query += " WHERE Email IS NOT NULL"
44
+ elsif has_email == false
45
+ query += " WHERE Email IS NULL"
46
+ end
47
+
48
+ query += " ORDER BY #{sort_field} #{sort_direction} LIMIT #{page_size} OFFSET #{offset}"
49
+
50
+ results = @client.query(query)
51
+ managers = []
52
+ results.each do |result|
53
+ managers << Manager.new(result[:'ManagerID'], result[:'Name'], result[:'Email'], result[:'Phone'])
54
+ end
55
+ managers
56
+ end
57
+
58
+ def count
59
+ query = "SELECT COUNT(*) FROM Manager"
60
+ result = @client.query(query).first
61
+ result[:'COUNT(*)']
62
+ end
63
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+ require_relative '../controllers/manager_input_form_controller_create.rb'
5
+ require './lib/models/user'
6
+ require 'win32api'
7
+
8
+ class ManagerInputForm
9
+ include Glimmer
10
+
11
+ def initialize(controller, existing_student = nil)
12
+ @item = 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, 70) {
23
+ resizable false
24
+
25
+ vertical_box {
26
+ @student_form = form {
27
+ stretchy false
28
+
29
+ fields = [[:name, 'Имя'], [:email, 'Почта'], [:phone, 'Телефон']]
30
+
31
+ fields.each do |field|
32
+ @entries[field[0]] = entry {
33
+ label field[1]
34
+ }
35
+ end
36
+ }
37
+
38
+ button('Сохранить') {
39
+ stretchy false
40
+
41
+ on_clicked {
42
+ values = @entries.transform_values { |v| v.text.force_encoding("utf-8").strip }
43
+ values.transform_values! { |v| v.empty? ? nil : v}
44
+
45
+ @controller.process_fields(values)
46
+ }
47
+ }
48
+ }
49
+ }
50
+ on_create
51
+ @root_container
52
+ end
53
+
54
+ def set_value(field, value)
55
+ return unless @entries.include?(field)
56
+
57
+ @entries[field].text = value
58
+ end
59
+
60
+ def make_readonly(*fields)
61
+ fields.each do |field|
62
+ @entries[field].read_only = true
63
+ end
64
+ end
65
+
66
+ def close
67
+ @root_container.destroy
68
+ end
69
+ end