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.
- checksums.yaml +7 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +69 -0
- data/lib/controllers/tab_students_controller.rb +43 -0
- data/lib/data_sources/db_client.rb +35 -0
- data/lib/db_config/config.yaml +5 -0
- data/lib/db_config/library_config.yaml +5 -0
- data/lib/db_config/migrations/create_db.sql +3 -0
- data/lib/db_config/migrations/create_tables.sql +29 -0
- data/lib/db_config/mock_data/mock_data.sql +72 -0
- data/lib/logger.rb +27 -0
- data/lib/main.rb +6 -0
- data/lib/manager/controllers/manager_input_form_controller_create.rb +44 -0
- data/lib/manager/controllers/manager_input_form_controller_edit.rb +54 -0
- data/lib/manager/controllers/manager_list_controller.rb +99 -0
- data/lib/manager/manager_db_data_source.rb +63 -0
- data/lib/manager/ui/manager_input_form.rb +69 -0
- data/lib/manager/ui/manager_list_view.rb +168 -0
- data/lib/models/manager.rb +41 -0
- data/lib/models/student.rb +102 -0
- data/lib/models/student_base.rb +100 -0
- data/lib/models/student_short.rb +50 -0
- data/lib/models/task.rb +49 -0
- data/lib/models/user.rb +32 -0
- data/lib/papaSquidLib/version.rb +5 -0
- data/lib/papa_squid_lib.rb +6 -0
- data/lib/repositories/adapters/db_source_adapter.rb +54 -0
- data/lib/repositories/adapters/file_source_adapter.rb +37 -0
- data/lib/repositories/containers/data_list.rb +74 -0
- data/lib/repositories/containers/data_list_student_short.rb +18 -0
- data/lib/repositories/containers/data_table.rb +35 -0
- data/lib/repositories/data_sources/db_data_source.rb +32 -0
- data/lib/repositories/data_sources/file_data_source.rb +75 -0
- data/lib/repositories/data_sources/transformers/data_transformer_base.rb +15 -0
- data/lib/repositories/data_sources/transformers/data_transformer_json.rb +16 -0
- data/lib/repositories/data_sources/transformers/data_transformer_yaml.rb +16 -0
- data/lib/repositories/student_repository.rb +32 -0
- data/lib/state_holders/list_state_notifier.rb +60 -0
- data/lib/task/controllers/task_input_form_controller_create.rb +43 -0
- data/lib/task/controllers/task_input_form_controller_edit.rb +57 -0
- data/lib/task/controllers/task_list_controller.rb +93 -0
- data/lib/task/task_db_data_source.rb +85 -0
- data/lib/task/ui/task_input_form.rb +67 -0
- data/lib/task/ui/task_input_form_factory.rb +26 -0
- data/lib/task/ui/task_list_view.rb +163 -0
- data/lib/user/controllers/user_input_form_controller_create.rb +42 -0
- data/lib/user/controllers/user_input_form_controller_edit.rb +53 -0
- data/lib/user/controllers/user_list_controller.rb +99 -0
- data/lib/user/ui/user_input_form.rb +69 -0
- data/lib/user/ui/user_list_view.rb +170 -0
- data/lib/user/user_db_data_source.rb +71 -0
- data/lib/views/main_window.rb +32 -0
- data/lib/views/tab_students.rb +148 -0
- data/papaSquidLib.gemspec +15 -0
- data/test/manager_test.rb +27 -0
- data/test/state_notifier_test.rb +82 -0
- data/test/task_test.rb +51 -0
- data/test/user_test.rb +39 -0
- 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
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,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,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
|