papaSquidLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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