From 14c3fd138d514d500b86720ceec38b5f6e478172 Mon Sep 17 00:00:00 2001 From: esoe Date: Thu, 19 May 2022 08:51:08 +0300 Subject: [PATCH] qq --- src/main/java/ru/egspt/App.java | 2 - src/main/java/ru/egspt/BaseControls.java | 11 +- src/main/java/ru/egspt/Data.java | 53 +++++++- src/main/java/ru/egspt/QuizesListModel.java | 5 - src/main/java/ru/egspt/QuizesTableModel.java | 62 +++++++++ src/main/java/ru/egspt/ReportPane.java | 124 ++++++++++++++---- src/main/java/ru/egspt/Result.java | 18 ++- src/main/java/ru/egspt/ResultsListModel.java | 5 - src/main/java/ru/egspt/ResultsTableModel.java | 64 +++++++++ src/main/java/ru/egspt/TagControls.java | 14 +- src/main/java/ru/egspt/UserListModel.java | 3 +- src/main/java/ru/egspt/UsersTableModel.java | 63 +++++++++ target/classes/ru/egspt/App.class | Bin 2606 -> 2606 bytes target/classes/ru/egspt/BaseControls.class | Bin 2074 -> 2217 bytes target/classes/ru/egspt/Data.class | Bin 1164 -> 3456 bytes target/classes/ru/egspt/QuizesListModel.class | Bin 288 -> 0 bytes .../classes/ru/egspt/QuizesTableModel.class | Bin 0 -> 1810 bytes target/classes/ru/egspt/ReportPane.class | Bin 2378 -> 4828 bytes target/classes/ru/egspt/Result.class | Bin 1276 -> 1514 bytes .../classes/ru/egspt/ResultsListModel.class | Bin 291 -> 0 bytes .../classes/ru/egspt/ResultsTableModel.class | Bin 0 -> 2086 bytes target/classes/ru/egspt/TagControls.class | Bin 1631 -> 1624 bytes target/classes/ru/egspt/UserListModel.class | Bin 3630 -> 3630 bytes target/classes/ru/egspt/UsersTableModel.class | Bin 0 -> 1895 bytes 24 files changed, 367 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/ru/egspt/QuizesListModel.java create mode 100644 src/main/java/ru/egspt/QuizesTableModel.java delete mode 100644 src/main/java/ru/egspt/ResultsListModel.java create mode 100644 src/main/java/ru/egspt/ResultsTableModel.java create mode 100644 src/main/java/ru/egspt/UsersTableModel.java delete mode 100644 target/classes/ru/egspt/QuizesListModel.class create mode 100644 target/classes/ru/egspt/QuizesTableModel.class delete mode 100644 target/classes/ru/egspt/ResultsListModel.class create mode 100644 target/classes/ru/egspt/ResultsTableModel.class create mode 100644 target/classes/ru/egspt/UsersTableModel.class diff --git a/src/main/java/ru/egspt/App.java b/src/main/java/ru/egspt/App.java index 3e01ed6..353af4a 100644 --- a/src/main/java/ru/egspt/App.java +++ b/src/main/java/ru/egspt/App.java @@ -29,8 +29,6 @@ public class App extends JPanel{ mainframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); mainframe.add(this); mainframe.setSize(640, 480); - //mainframe.setLocationByPlatform(true); - //mainframe.pack(); mainframe.setVisible(true); } /** diff --git a/src/main/java/ru/egspt/BaseControls.java b/src/main/java/ru/egspt/BaseControls.java index 328d195..505d819 100644 --- a/src/main/java/ru/egspt/BaseControls.java +++ b/src/main/java/ru/egspt/BaseControls.java @@ -11,12 +11,15 @@ public class BaseControls { String password = String.valueOf(app.getAccessPane().getPassField().getPassword()); app.getBase().getAccess().setPassword(password); app.getBase().connect();//подключиться к базе - app.getData().setUsersFromBase(app.getBase()); - app.getData().getUsersToConsole(app.getData().getUsers()); + //инициация данных из базы + app.getData().setUsers(app.getData().getUsersFromBase(app.getBase())); + app.getData().setQuizes(app.getData().getQuizesFromBase(app.getBase())); + app.getData().setResults(app.getData().getResultsFromBase(app.getBase())); //данные в панель отчетов app.getReportPane().init(); - app.getReportPane().setData(app.getData()); - //app.getReportPane().getPreferredSize(); + app.getReportPane().setUsers(app.getData()); + app.getReportPane().setQuizes(app.getData()); + app.getReportPane().setResults(app.getData()); app.getReportPane().setVisible(true); } diff --git a/src/main/java/ru/egspt/Data.java b/src/main/java/ru/egspt/Data.java index 6efe2f0..2efe86e 100644 --- a/src/main/java/ru/egspt/Data.java +++ b/src/main/java/ru/egspt/Data.java @@ -1,10 +1,11 @@ package ru.egspt; +import java.sql.ResultSet; import java.util.ArrayList; public class Data extends UserListModel { - ArrayList quizes = new ArrayList<>(); - ArrayList results = new ArrayList<>(); + private ArrayList quizes = new ArrayList<>(); + private ArrayList results = new ArrayList<>(); /** * @param quizes the quizes to set @@ -18,6 +19,29 @@ public class Data extends UserListModel { public ArrayList getQuizes() { return quizes; } + /** + * @return полный перечень опросов из базы + */ + public ArrayList getQuizesFromBase(Base base) { + ArrayList q = new ArrayList<>(); + String querry = "SELECT id, name, timelimit FROM mdl_quiz"; + ResultSet rs = base.querry(querry); + try { + while (rs.next()){ + int id = rs.getInt("id"); + String name = rs.getString("name"); + Quiz qu = new Quiz(id, name); + q.add(qu); + } + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + + return q; + } /** * @param results the results to set */ @@ -30,4 +54,29 @@ public class Data extends UserListModel { public ArrayList getResults() { return results; } + /** + * @return полный перечень результатов из базы + */ + public ArrayList getResultsFromBase(Base base) { + ArrayList r = new ArrayList<>(); + String querry = "SELECT id, quiz, userid, grade, timemodified FROM mdl_quiz_grades"; + ResultSet rs = base.querry(querry); + try { + while (rs.next()){ + int id = rs.getInt("id"); + int quizid = rs.getInt("quiz"); + int userid = rs.getInt("userid"); + double grade = rs.getDouble("grade"); + Long time = rs.getLong("timemodified"); + Result result = new Result(id, quizid, userid, grade, time); + r.add(result); + } + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + return r; + } } diff --git a/src/main/java/ru/egspt/QuizesListModel.java b/src/main/java/ru/egspt/QuizesListModel.java deleted file mode 100644 index e9fc63a..0000000 --- a/src/main/java/ru/egspt/QuizesListModel.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.egspt; - -public class QuizesListModel { - -} diff --git a/src/main/java/ru/egspt/QuizesTableModel.java b/src/main/java/ru/egspt/QuizesTableModel.java new file mode 100644 index 0000000..e8d31ca --- /dev/null +++ b/src/main/java/ru/egspt/QuizesTableModel.java @@ -0,0 +1,62 @@ +package ru.egspt; + +import javax.swing.table.AbstractTableModel; + +public class QuizesTableModel extends AbstractTableModel{ + private String[] header = {"id", "name"}; + private Object[][] data; + public QuizesTableModel(Data data){ + setData(data); + } + @Override + public int getRowCount() { + return getData().length; + } + + @Override + public int getColumnCount() { + return getHeader().length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return getData()[rowIndex][columnIndex]; + } + /** + * @return the data + */ + public Object[][] getData() { + return data; + } + /** + * + */ + public void setData(Data data) { + //создаем объект data - инициализация переменной + int row = 0; + row = data.getQuizes().size(); + int col = 2;//по количеству заголовков + this.data = new Object[row][col]; + //заполняем модель данными пользователей + int i = 0; + while (i < data.getQuizes().size()){ + this.data[i][0] = data.getQuizes().get(i).getId(); + this.data[i][1] = data.getQuizes().get(i).getName(); + i++; + this.fireTableDataChanged(); + } + } + /** + * @return the header + */ + public String[] getHeader() { + return header; + } + /** + * @param header the header to set + */ + public void setHeader(String[] header) { + this.header = header; + } + +} diff --git a/src/main/java/ru/egspt/ReportPane.java b/src/main/java/ru/egspt/ReportPane.java index 91abbd0..3dd0e4f 100644 --- a/src/main/java/ru/egspt/ReportPane.java +++ b/src/main/java/ru/egspt/ReportPane.java @@ -9,51 +9,123 @@ import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.LineBorder; import javax.swing.border.TitledBorder; +import javax.swing.table.TableColumnModel; public class ReportPane extends JPanel{ private JPanel controlPane = new JPanel();//панель кнопок - пока не надо private JButton generateXLSXButton = new JButton("create xlsx"); private JButton generateTXTButton = new JButton("create txt"); - private JPanel tabPane = new JPanel();//панель таблицы - private JTable table; - private ReportTableModel tableModel; + private JPanel usersPane = new JPanel();//панель пользователей + private JPanel quizesPane = new JPanel();//панель опросов + private JPanel resultsPane = new JPanel();//панель результатов + private JTable usersTable; + private JTable quizesTable; + private JTable resultsTable; + private UsersTableModel usersTableModel; + private QuizesTableModel quizesTableModel; + private ResultsTableModel resultsTableModel; public ReportPane(){} public ReportPane(App app){ - tableModel = new ReportTableModel(app.getData()); - table = new JTable(tableModel); - //table.setTableHeader(tableModel.getHeader()); - //table.setPreferredScrollableViewportSize(new Dimension(500, 70)); - //table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); - //table.setAutoResizeMode(JTable.HEIGHT); - //table.setPreferredScrollableViewportSize(table.getPreferredSize()); - //table.setFillsViewportHeight(true); - //table.getMaximumSize(); - //table.setFillsViewportHeight(true); - JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - //scrollPane.getMaximumSize(); - tabPane.add(scrollPane); - + setupUsersPane(app); + setupQuizesPane(app); + setupResultsPane(app); } - public void init(){ - controlPane.add(generateXLSXButton); - controlPane.add(generateTXTButton); + this.setupControlPane(); this.setLayout(new BorderLayout()); this.add(controlPane, BorderLayout.NORTH); - this.add(tabPane, BorderLayout.CENTER); - tabPane.getMaximumSize(); + this.add(usersPane, BorderLayout.WEST); + this.add(quizesPane, BorderLayout.CENTER); + this.add(resultsPane, BorderLayout.EAST); TitledBorder border = new TitledBorder(new LineBorder(Color.black), "report", TitledBorder.CENTER, TitledBorder.CENTER); this.setBorder(border); this.setVisible(true); } - public void setData(Data data){ - getTableModel().setData(data); + public void setupControlPane(){ + controlPane.add(generateXLSXButton); + controlPane.add(generateTXTButton); + TitledBorder border = new TitledBorder(new LineBorder(Color.black), "ControlPane", TitledBorder.CENTER, TitledBorder.CENTER); + controlPane.setBorder(border); + } + /** + * Настройка панели пользователей + */ + public void setupUsersPane(App app){ + usersTableModel = new UsersTableModel(app.getData()); + usersTable = new JTable(usersTableModel); + //настройка заголовков + int i = 0; + while (i < usersTable.getColumnCount()){ + usersTable.getColumnModel().getColumn(i).setHeaderValue(usersTableModel.getHeader()[i]); + i++; + } + JScrollPane scrollPane = new JScrollPane(usersTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + usersPane.setLayout(new BorderLayout()); + usersPane.add(scrollPane); + usersPane.add(new TagPane(app), BorderLayout.NORTH); + TitledBorder border = new TitledBorder(new LineBorder(Color.black), "Users", TitledBorder.CENTER, TitledBorder.CENTER); + usersPane.setBorder(border); + } + /** + * Настройка панели опросов + */ + public void setupQuizesPane(App app){ + quizesTableModel = new QuizesTableModel(app.getData()); + quizesTable = new JTable(quizesTableModel); + //настройка заголовков + int i = 0; + while (i < quizesTable.getColumnCount()){ + quizesTable.getColumnModel().getColumn(i).setHeaderValue(quizesTableModel.getHeader()[i]); + i++; + } + JScrollPane scrollPane = new JScrollPane(quizesTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + quizesPane.setLayout(new BorderLayout()); + quizesPane.add(scrollPane, BorderLayout.CENTER); + TitledBorder border = new TitledBorder(new LineBorder(Color.black), "Quizes", TitledBorder.CENTER, TitledBorder.CENTER); + quizesPane.setBorder(border); + } + /** + * Настройка панели результатов + */ + public void setupResultsPane(App app){ + resultsTableModel = new ResultsTableModel(app.getData()); + resultsTable = new JTable(resultsTableModel); + //настройка заголовков + int i = 0; + while (i < resultsTable.getColumnCount()){ + resultsTable.getColumnModel().getColumn(i).setHeaderValue(resultsTableModel.getHeader()[i]); + i++; + } + JScrollPane scrollPane = new JScrollPane(resultsTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + resultsPane.setLayout(new BorderLayout()); + resultsPane.add(scrollPane, BorderLayout.CENTER); + TitledBorder border = new TitledBorder(new LineBorder(Color.black), "Results", TitledBorder.CENTER, TitledBorder.CENTER); + resultsPane.setBorder(border); + } + public void setQuizes(Data data){ + getQuizesTableModel().setData(data); + } + + public void setUsers(Data data){ + getUsersTableModel().setData(data); + } + public void setResults(Data data){ + getResultsTableModel().setData(data); } /** * @return the tableModel */ - public ReportTableModel getTableModel() { - return tableModel; + public UsersTableModel getUsersTableModel() { + return usersTableModel; + } + /** + * @return the quizesTableModel + */ + public QuizesTableModel getQuizesTableModel() { + return quizesTableModel; + } + public ResultsTableModel getResultsTableModel() { + return resultsTableModel; } } diff --git a/src/main/java/ru/egspt/Result.java b/src/main/java/ru/egspt/Result.java index 2518a9c..f4e636b 100644 --- a/src/main/java/ru/egspt/Result.java +++ b/src/main/java/ru/egspt/Result.java @@ -1,12 +1,20 @@ package ru.egspt; public class Result { - int id; - int quizid; - int userid; - double grade; - Long time; + private int id; + private int quizid; + private int userid; + private double grade; + private Long time; + public Result(){} + public Result(int id, int quizid, int userid, double grade,Long time){ + this.setId(id); + this.setQuizid(quizid); + this.setUserid(userid); + this.setGrade(grade); + this.setTime(time); + } /** * @param id the id to set */ diff --git a/src/main/java/ru/egspt/ResultsListModel.java b/src/main/java/ru/egspt/ResultsListModel.java deleted file mode 100644 index 7e35066..0000000 --- a/src/main/java/ru/egspt/ResultsListModel.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.egspt; - -public class ResultsListModel { - -} diff --git a/src/main/java/ru/egspt/ResultsTableModel.java b/src/main/java/ru/egspt/ResultsTableModel.java new file mode 100644 index 0000000..1b3a8eb --- /dev/null +++ b/src/main/java/ru/egspt/ResultsTableModel.java @@ -0,0 +1,64 @@ +package ru.egspt; + +import javax.swing.table.AbstractTableModel; + +public class ResultsTableModel extends AbstractTableModel{ + private String[] header = {"id", "Quizid", "Userid", "Grade", "Time"}; + private Object[][] data; + public ResultsTableModel(Data data){ + setData(data); + } + @Override + public int getRowCount() { + return getData().length; + } + + @Override + public int getColumnCount() { + return getHeader().length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return getData()[rowIndex][columnIndex]; + } + /** + * @return the data + */ + public Object[][] getData() { + return data; + } + /** + * + */ + public void setData(Data data) { + //создаем объект data - инициализация переменной + int row = 0; + row = data.getResults().size(); + int col = 5;//по количеству заголовков + this.data = new Object[row][col]; + //заполняем модель данными пользователей + int i = 0; + while (i < data.getResults().size()){ + this.data[i][0] = data.getResults().get(i).getId(); + this.data[i][1] = data.getResults().get(i).getQuizid(); + this.data[i][2] = data.getResults().get(i).getUserid(); + this.data[i][3] = data.getResults().get(i).getGrade(); + this.data[i][4] = data.getResults().get(i).getTime(); + i++; + this.fireTableDataChanged(); + } + } + /** + * @return the header + */ + public String[] getHeader() { + return header; + } + /** + * @param header the header to set + */ + public void setHeader(String[] header) { + this.header = header; + } +} diff --git a/src/main/java/ru/egspt/TagControls.java b/src/main/java/ru/egspt/TagControls.java index 3212917..1ca413d 100644 --- a/src/main/java/ru/egspt/TagControls.java +++ b/src/main/java/ru/egspt/TagControls.java @@ -11,8 +11,8 @@ public class TagControls { //Выводим пользователей в отчет Data data = new Data(); data.setUsers(app.getData().getUsersByTag(app.getData().getUsers(), app.getTagModel())); - app.getReportPane().setData(data); - app.getReportPane().getTableModel().fireTableDataChanged(); + app.getReportPane().setUsers(data); + app.getReportPane().getUsersTableModel().fireTableDataChanged(); } //удаляем тег из модели public static void removeTag(App app){ @@ -22,10 +22,10 @@ public class TagControls { app.getTagPane().updateTagArea(app.getTagModel()); //tp.getTagArea().update(tp.getTagArea().getGraphics()); app.getTagPane().getCurrentTagField().setText(""); - //Выводим пользователей в отчет - Data data = new Data(); - data.setUsers(app.getData().getUsersByTag(app.getData().getUsers(), app.getTagModel())); - app.getReportPane().setData(data); - app.getReportPane().getTableModel().fireTableDataChanged(); + //Выводим пользователей в отчет + Data data = new Data(); + data.setUsers(app.getData().getUsersByTag(app.getData().getUsers(), app.getTagModel())); + app.getReportPane().setUsers(data); + app.getReportPane().getUsersTableModel().fireTableDataChanged(); } } diff --git a/src/main/java/ru/egspt/UserListModel.java b/src/main/java/ru/egspt/UserListModel.java index 323bcd5..48c0ed1 100644 --- a/src/main/java/ru/egspt/UserListModel.java +++ b/src/main/java/ru/egspt/UserListModel.java @@ -19,11 +19,12 @@ public class UserListModel { public void setUsers(ArrayList users) { this.users = users; } - //берем список пользователей из базы (сразу после подключения к базе данных) + // устанавливаем список пользователей из базы как текущий public void setUsersFromBase(Base base){ ArrayList us = getUsersFromBase(base); setUsers(us); } + // берем полный список пользователей из базы public ArrayList getUsersFromBase(Base base){ ArrayList us = new ArrayList<>(); String querry = "SELECT id, username, email FROM mdl_user"; diff --git a/src/main/java/ru/egspt/UsersTableModel.java b/src/main/java/ru/egspt/UsersTableModel.java new file mode 100644 index 0000000..7b599ef --- /dev/null +++ b/src/main/java/ru/egspt/UsersTableModel.java @@ -0,0 +1,63 @@ +package ru.egspt; + +import javax.swing.table.AbstractTableModel; + +public class UsersTableModel extends AbstractTableModel{ + private Object[] header = new String[]{"id", "login", "mail"}; + private Object[][] data; + public UsersTableModel(Data data){ + setData(data); + } + @Override + public int getRowCount() { + return getData().length; + } + + @Override + public int getColumnCount() { + return getHeader().length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return getData()[rowIndex][columnIndex]; + } + /** + * @return the data + */ + public Object[][] getData() { + return data; + } + /** + * + */ + public void setData(Data data) { + //создаем объект data - инициализация переменной + int row = 0; + row = data.getUsers().size(); + int col = 3;//по количеству заголовков + this.data = new Object[row][col]; + //заполняем модель данными пользователей + int i = 0; + while (i < data.getUsers().size()){ + this.data[i][0] = data.getUsers().get(i).getId(); + this.data[i][1] = data.getUsers().get(i).getLogin(); + this.data[i][2] = data.getUsers().get(i).getMail(); + i++; + this.fireTableDataChanged(); + } + } + /** + * @return the header + */ + public Object[] getHeader() { + return header; + } + /** + * @param header the header to set + */ + public void setHeader(String[] header) { + this.header = header; + } + +} diff --git a/target/classes/ru/egspt/App.class b/target/classes/ru/egspt/App.class index 77627917cdb7ad95d79050a8820566a4edb8b5eb..8d92cca15f63bc16ecb0f5ff81d8403e09fa9b92 100644 GIT binary patch delta 91 zcmZ1{vQA`!76+>Wg9?Mmg9?N4WPJ`dMvciII7BCRbEq@wfmtVjEE6EhhS3Vlcj8oMbO5vJ ifh@Pl%Q*uCy%;zcycq--d>BL+d>JGd{3mm8sR00f^%lwi diff --git a/target/classes/ru/egspt/BaseControls.class b/target/classes/ru/egspt/BaseControls.class index 4e9a46afda31d033371396e8428a980eb8a9027d..46a68051e2ea2d641d6828a14d9c6a697b5d3224 100644 GIT binary patch delta 655 zcmY+AOHUJF6o#KE(3Ofs1_FGN<&ZiW}Yt zTtArbYYQbOa5c`JEBjHwtpxS3pen_DdCqA#g(&o@h0DJ0G|OHP7ENZDwWx4Mqd(|P ziFftk_6&0t^W4_R$@FWH*K+s9D{8@FQBhf;x~{6$E$%92P?+m(5LLqiP+$=%$P}n& zn~c)1xW|&l;SN==`Qg?0k3MR&c#z?Kd?r0Kxs0Kqdy8IZ(xR;*ugaSLUU|g{onro` zvLC5zt4cjq3p;Av;wjJKMmo?o;@{~>J+^osUozIS8g(>F*IXMmb$#7K85whfo=QDPD zfLUyoq~V2F8yw>c$N9<$wmHcTr#K|&ST{A#r3>l%#!FtI$&gK6i%LB#tJxy^THiE@4Qr$%{AlqMhf6AaGhz4GT8XS!Z>j-a3sB(vjlhKc?55ZvX%Q delta 502 zcmY+APfrt36vcn94lN9m(iWnC3rXA*LQ)sH01}PW;HEKzD4Q-|7GoJ`JN3O+5K!?S ze-w7J;~Thy#VlO7bm3R zirOY>irIL%w&8F2m97n&m4{mUJGIc*p5-mt9ub}R-oR{KV{;hA=-=q&pc84kWwnOWp+4gwFjv^)T^VjToyyi{(W5B4xcs~2YIrjJ*A7l@Q95Oia z3&-(Tu0D4sVRa^QVSOpN(Tw!5-vL) d{maga0wx$_a!O=3dvRW0bQP!gA|n}2egg>>aghK3 diff --git a/target/classes/ru/egspt/Data.class b/target/classes/ru/egspt/Data.class index 7693bdfcd19383f305e390f298058f69137ebe7f..8145cae4b07bca299de7f4cfddff09206b26207b 100644 GIT binary patch literal 3456 zcmb7GX?GJ<7=9+CnKT_J23jb%45*kcG_EWS6bo%NC2fIV5nOQE40SL|JDFgMplpg8 z;=X?H_`%~>T~ZjlcbFYJw0b~=gzx4@AE$Qz5V^K+jjswiSJbS z6s)!jQFAgse=i`c(D&NR;-s!s%_>AX@_AWcX2r)4W(0HkCnBYUInWn z?PCi32Z%6)RcO}G1Wm;~3f9%Z7{XdKH$uUB4Gjp0RjYq;q4UzVGv=LFH{+E@x6x`zl9JF(p{YG9iFjA>e?8N>p&(8m3xH4@J+Xyl_kQg{{ zRJT%Hde+F8UAkjs%(RuU9DVS}=&+tirB4dog%Cl9iuP*B3RoIC(IvHM+V-rd+NC3H zWGACZ$F{PQW#swkbkx;Q(sW`$bSv;#sU|#%$5lMWhD*iNSZR0yPcl0BiDw-uzh3ls z5Id+r0bc~$rC~REs0cc_03?|*cpX<PpTc*C+H8LJYk^)%z%jNW4yQV?xz^8usG= z&x4UlErU5ae%hRHV(ljcxB(4=ct)T#XIKx9&xuCFaZtsOg0)o`XY-Dk(U8C}tw^nR z>aAS#5Lp$anMQ^*jw*Pm_ zvR?eTc%wM4)Aj~!ek*-YdRymWPA^?9T`XOayLV{4C}Z5wySuyf5Dp`$;z;>S*CNnx z6wh&tObJlw?6Ts^3Lr_xa9qXn z>!|U3$w9@lGHrJM-yz}!4C0J}zN#@IrbU-t;N2yL%A{?imZnN3m$FV-W~z3uoRk*% zAjqa)_y%#7C*JiB;+%p8X(3L}n;PE21@~z8=L+(gs5=t+gSezX6SJ(GRrp`g@HXC| zSV=)5mz`XuqOw?rLU4G_WieiooEzM;q0bvtU@e%dn z-Lx)KAzZ`9Vvc;GU_&GxkM~zeQM!q)Dm>@%nzuMblzuWIN}zU@8`I2|*D)`T%002v z6sjYcE7%j}pd~KSMsY=Ui$bu4H|{F_`{CmsFJQi@@-4`BUc=sdi2I7T%K2PPi^KF% z_`A7d9&0)lvG({p!gE+xS+@Kv18v|l3_qU%K2~ORrk;kIcs4w8 z3y0boZei>uUJ$=8cikYgFlS+cL)0(9_L2#Z#~@j3B9CF*j}}?0&I@@9c3~^_aW9UC z==Cs0unl8)1TXL!pP+^4$BS$^3-DMpVPKq@f*iOLr zr52>Rs#i&U+?{ooDwl68;JgpJgIr!*z-1qP#nqnBBCb&{ErAwwW3VkWkLx{6 zU2RP@s`>G*s>$Pwrz3^)=(?w%tN3(DL03Elo%a+J_Y~BN�vUGe3c|T&c_$ v!8v?RjHA@|7xgY@45)(q`tF=~Ne5cc1_lNb291qe+)R^s*-9s;aVRM=Ft9SPF)%W)1Lc?)IDjN45}%8K zb@ECM2VPbN7N96UP?Z!=3pvHPWq`UNW++cq;Z|mq1j2Fgb&0a8fo)X>0GhKE&j0`b diff --git a/target/classes/ru/egspt/QuizesListModel.class b/target/classes/ru/egspt/QuizesListModel.class deleted file mode 100644 index 669b615e770c0987a834c8016c6b9e4655c87699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmZ`!yKcfj5S%qO28RR-Q6M_Hkb-N{C89y1G9Uz^KbsRdWbDX3r^sKWLZZkAmA>iJEG=rF-XZWUXNUHp1_KBUuBCJ~MIUfcJ7l%K+14DuJ$HXsXZt z5ubeVLD#a>3sr}6A9J#H1%a<{$SnK$nUH6A41tJHI-EcgC zb9-f(VKr@@ulOF*3Ick=_HBWgz0v4)?Xgq$8I7#EE!STcNMyuw-Lh(^IGLi+t2a!XhanK{IKHeeFkN?!=CzMXt%mbVK$Hl&t{SQxDc`b*C}IZkSc&38fvFQCGI15x`e^!+2+U@J zHeKIsT1C&Zzbm^PzhK}7K8oTdO`-;OGHjxN1x~F)6RLhUux{dGd_v(!Lm-)%1V4&T zMAMiKe;Wsi;h0#I_h^hru!y#q*-SkxnAEza?~3KycSM_l&CqMl$xTuWKi+#`nQ|* zlfZCsI`nwDsmz4o%9~+S+Fh^i+;*Epk{oyB6-gBrh$Y19uJOlPpjMQZ|1n15kXTRg z?Hfil{-<*>%(q7J^R8>K%yWdbsfFXP(j^Yeu*aOsP7iT1SF90v9J{U;1BmVq$g< zOF{2D>?PHR%ieSObpDsI_Oq(MLjTZ!MjY?qeFZ6wD_m(@^9lz=E&faB;oNVq#tY7m zAPNuo@GBG~|3eMKOsX=hE|kVO4t$D|Ai&32U-&QqPCviKO1c+Mg)) zu<<)?SAvj!GE}bopbK*RBB=tb`s2SZ<@iEM>O4%Y7s=xyfn4I-WsWY(k7JGymvEhY zx5;ydY^&U>VOh~w=|dgpQV+(f!A3>tV&Wkla1~;$d-#$oofRlJwAV-rA#Rd4zh43S zQR$N7(p{Y>-9vm8B(D>{v}`1|M28N|X{g--v978LeN!HrNg7RF1Ua)^W^4HRKSx1P APXGV_ literal 0 HcmV?d00001 diff --git a/target/classes/ru/egspt/ReportPane.class b/target/classes/ru/egspt/ReportPane.class index 05ee4462ea258ebfdf42d068417323d310aefe9d..79880c501d9a699711b127f595a728cd37ceca1c 100644 GIT binary patch literal 4828 zcmb_f`Fm8=8Gdgv$xJ2(69OWb7&gIV(qxoEQV41#Vol5;!Sc*28Nko=8iim2ks@P9mOk@3do%A3h6p`|bPe*>LJ`BsLxHk;_pF z)syj0r-kLci)A{gIqk%pr0qJRy+flr(ykkiS-7%LRxeX{X;yf6bT}(pl}=TCn2+kDlS)V3?3NN6wkM*Cv8Yv=uh!~DNEm(dS(7)=7oU>;UEQ0bW4FYh z1l1mG)p~3h`TD&4E`_r|VX5~xqtTGp7}U-bs8nu`#3JrZ7RsBNM=bcdh%1P4)C*jN zl~u5CjX(t|{aDS|70|EQ3t+7bQ_>;-Yi6UV*&rIRUTR;tr%Ces+f-M%VNI7mgq2eNQLvC#o z=#*PEYD(bR?HRIlQkC0@1nm_bMz$sQ(rlN&tyq~=?aJr8AGZ;`q&;jO zcEda3$tfqb}<3$sVNK19>uQs!9+af#N19#6bB~uJCm+5Gei&eI4L)P-4-glDCi^u*u&MG zcFOf*%))AK#!M*m;o*oIb*8i{e(Yt2l@OBQ)go1RJNEf;H~Gu)&=rrylLGg^rY93o zd-4Fe(;%hCYP&OtaZJiYq+81h+@i8_;9kN`sxB17C}yN=#KI;mn{7n~wFcv5!sK&z zx6Yaa0#O{)VbH=B8vmautrizZ;1H{T(Hn`RBC5Ign#N@{R_e1YtSx9}29cLXI$Msk zjO2Z+paN&JF>LnolU)p8meuP?IBDmA9}ieqnJby1&J@Ihc*u`;S`axA7LUNgc$WqL zwBz1ty9~_IrsjOY%O!$5f}@htdFT7h|DeC-qPw|DI3Oa~K@m^`*edMH& zTUSWskW@dYncUGa3xRhLA!A5UAj%1c4d&?K*Dbw>yB z6uu+_^koaHN~WPMmvYd~S6Q^V3>vnlbt8QSUzY~9$V?mv;5k;fN0YAE%1-?= zfuG|SY-Y@=V)RS`Z@Cq3Gquj)Re@j0((|*`=o0l!sYoNE^1MUdTE`PSlpY3_HZG5tU7+)XlH5lMqaTu#HhBXTL3XRSnCrG?c*(^0bo_zb%8?L!sxqabw+UGtcz zb1Ew4G2JV{?+^Jhh~+&9@%brP_hCKxzLo*rz}ZH$;yQGo34LUL5FzYAiwFIvLElIJ zlSnD_eB7A`JYdjwNVNRFAp>`hnK#RM5xm0&9;J!!{yex9%xe&eKpTyR`FlOuaf1g) zhXK;Y_jDEr-?bWu)lMMN!WmL{WQ?}oF^@;)aGalyjuFuDd7PNT$?_YY#%g|^%-{nJ zFW~Vq$h{0c-mocyPaP|>q!ZkH@`?Yxwt%Ok=E>USwT<)mVn63Cx%hlVezh8Jx%|vn z%RIg&<8`*k$gkYV#U&FD+oe3+*u|91U1 z)?4*tkADCd4%ZnDPm#29hQk-EM&W06Qpn`RO{47(pOqF~kmx05|jK0_^jFXmp4V6${C{}*3 Wq%xl%C6q4~D?eOP`5y}3KmP~W;C=A` literal 2378 zcmbVNYgZFj6x|n+42dHkBED(`v6TcgtxB~G#VXcT8`KH{p{+UzQy2_0>13kOKJ4@V zv|T0XDr@xz^h1AASNFLSG67lr&=1Mnx%b?2_C9ByGk^W_$DaT$;wJ-L3J3jK)?Tev zg6uuJ;`zZ{%e4)}6b9C!{J)q=ot6%OsR4Yz50VB2_pX@1+*2&`flAR+W3Ssr&sPOk~5*x0UtMwFy za9nP`!n_@MG%exh&9Ddp9mthRMWHuJh@_e|uC`$?_)g772x%A- zIU1N{9fd|#{9p6@72D5S&%9cYLLLWG6vtf?ALE`vvT6t65vAUNG~AoDTx-?#nWP@f zE5vWJmDl9@f>2ykNOxR`649aBJH>Uo6lezpw#y9jWc!k&PfUD@&&ZWRn6>K8Mr~ux zdCsOBq8{4VuR9yITXj4)XW*g2$ck#K(gLAL5+!gHu`s>u zC^KH!^G$q?RdOtrt&ejbFeRQnb_*)atrHx}Ny4U+6Ve4il z&N;8^6qXSE_;-Z1& z#VtH2Y~fMiR}`CA8+aU#H?fh=ka#5%YarOo=M3{bh9k`JC_flyG0v$!fh%0y$2lw` zi--KyNL_}AnD|z)ZoTk#_%lq@ z1Zv`iKfoVleCO;!&APogb9T<0cb=I!`}@z&UjR1nG=qe~P^;s(wf1}8dF{44bw7iY zLjJV+vFg;TjhgfF=+r&-6%yWwf+{N*A3EMA`7k2m&>JS=Hg)v3KJ$Kaf_^N*DsSfWtD@2X%jPYkmbQEU73W> znJ8R(-|8~OyI^7ww-p8$yC2k?vPyx@T@y>N6f!(J&^;Kn{zu7D#WsZ$rqAFLO{7o2$;4+(U!@zWhPpaH#kGCL;P}R6>Zx7f&6zJHp11= z&KyR$mkW~M25!>Ii9vV zsG8Ln*O_C8L^r@}Jsg<8ERD2Npc!v7-)9>jvIML{-VLHJ8vfh6?+4SVSV>rs#` zf^7Ezk%0@yLp%z#9L_=>NZLNf`q#*4p2dRj{|_(s-pKL=HlrYW1ljKcBJWK=o?t7~ S`uB}&ev5!qVnMcb)XrbU8>+$p literal 1276 zcmZ{iU2hUW6o%j7v%p#?t+f`b#Sd60cC~t8qQMJ^hJ@6pmHP!YxD5qecD?X7nWzcG z#0!6bKg#&d%o=pFT`NI-N2G9Lo>lRRXCx#P)AdhFRFhkrW)Dc`-|w$xii=*_0% z$CN*Dr>@@?NScj4h0kUqCyyky3|zt{L3-}gISnobj(27cCJa*U&4%`*Z+oshhnFe; zojVuU>P5JjAw75eE_qUBx6#i*;HrT%G7?b#U}iobN7*a&2C2DjAS*RFYV@sEyj72r zikk*D{wnmXzy@Qy(63IJ9i6RiAcs8vF;e)C30adY#b>H4+h(*b+V!r10t_nYs+DE4 z5tRz$-^>DU=sb62bqcy)$Fk63i&K$39l^Slw~H`0zFuFu0@_KT0xs` zen;sWHwl!vX4GX8+uR#kfE`@sNnjUOxJu_X)d{I?R+iXXdFR#bCZUQd!md_@5oC0B zhcN{9Q3+$MKo;2h%%J~*?8Jgxiw8M~g6uP0Wetd|l?1sF3vv(zIgAB4j0dSkL23l4 zuK|(Gk|4KYL8?)ZRxHSE++hganxvYGOtZd3Eedi%kOyl(8W1_I669D7>HovJK5>%LCS4*Lq*MkZK=f;8MHVe~ZmJ74t9O~IRx&e+&`--;nzgL7_vd2hKD8x` z(yIWkgk)LPRj%H(KQp)_eD-j-2cz&u;7A^UHD)JH9*CayX#H>@K*H+V;DuY(_9>4z M-mxQeSOawb0eQASL;wH) diff --git a/target/classes/ru/egspt/ResultsTableModel.class b/target/classes/ru/egspt/ResultsTableModel.class new file mode 100644 index 0000000000000000000000000000000000000000..437e3af7f943dedf301587341ea3152d767dd66c GIT binary patch literal 2086 zcmZuxT~ixX7=BK&$tLMi+LQ!aKtU-@LfatyRN7PoOQWG!LeYp{OR~VykT9D~slE2X z@xnjgjgA-f!V5nrcAT-}jW_-!XR6ORyMzQXJF|QCykF0G-se64y!hiefXmp{5fC`z zG_%%vW82LxT8(DaZ7i9qRcpRpv8p;WfzeI#q4_A=*s*KtSy$S!)2j{FG0X0Or$Bha zGAouNaB8I>BeGSK{zcbe*pz@)F8P3u)1lLU0TC8?3(T71mdYe3(hPfrqaud zogtVQg6J_2#c_dPD!r`Zgusczl_H1>1nf!#eaw2VX+M_hB-i&FmLu0M354bxLXF@I zQ!m+DRulq*20{qOxO&;ZD~Ji`4a=1f1bPd0&AQv%TD2T?V!|xc%Vu@ibZp6ozp1$! zc7vG?PH==!9<}$ttPUt}Y~6Af>pL^`X3bS+%S#w318HOkgH{hlGL`Pm-f_Cj)T_;{ zn#v)gFBrIptU#2eJAPvljPKT(7=4z_YSWr#`D7}ePq%rsS`=~WJNa70dL$t71YK4I z)sE!vssSC57_Q?@9d8KqbhOdH6mAH}NN{5tNC`W7Y+L=1Cy*T8!+VTi%`N(}Q@ z&~aDb3V90Tv;9{cf7Qnj$AsA^}*cO(8e6b&rNtdf3DgmQP;zz6%go*d!&A_@GsJ=DZ@nkHeHnYLewHO~{&-rGn*>sytExKm;!MwTcD?Z8**;iLG)kR!# zdSk_U(R8uJTJsDB`w*~7W#KhZ0IVZOuM2YOTF}_qR$_Rj(3fo z!0UePIo6WoL}l%P$-&8=`O{v$UnLm!oLa|-ViK1Wq$n@@ON@%M1?vjkg0&aV2NyZZV&lqC=`8@)@fR7Gle=$_uEY2PSc0a@bP{^z0+hCztjXtvl6NjVSfK#Rq7$A zdY3~l*P|rnEKfED1LvrPG)|MGL3ZyN&SMc5u*JLdD`fE@icNk!kKXnz=8H-YBxu;w^RmC^ZQzrI+kN6B~fE^0QLU?NK~2m literal 0 HcmV?d00001 diff --git a/target/classes/ru/egspt/TagControls.class b/target/classes/ru/egspt/TagControls.class index 0af4d796a97fb87c72529492778030a424d870f2..1951a62e048adf414648a8e8af049238a90b6b9f 100644 GIT binary patch delta 211 zcmcc5bAyNL)W2Q(7#J8#7?L(}&0uDBW$>T8o>?*>kcT0NA()XtC_S|#v^ce>I3zJC zC)GDUB{heUK}JKImvHNCi?L?2Donu{TnA)K8djFCYCml__1h{>ufku32%46&1& zST3;yY-0$S9KmWO9LW#`bc`;8CPOqs3Vob1{T5M6ff2 zGcriR4MkJLlEcFgIa!V+k|lwMA#QRt%O#e;Z49B416i$vqZp!r4%KDQWQbviWng6B g1S*)vD$f`{c^|7YL>Vial_a_{MutS7HYSE70CrYBO#lD@ diff --git a/target/classes/ru/egspt/UserListModel.class b/target/classes/ru/egspt/UserListModel.class index 55b0aa83c1d51c5a533d0a25fab2cced00c243b5..967ae4cc2c2184e18f60c00700e8470f7a7a02b5 100644 GIT binary patch delta 150 zcmWNJOA3Ne7)DP)5Zn}soQRn{={?XMBdN3qDQFTwIBe3e9RzK`ZNx=rCGDtx_B?^!N_;KxEhZ6FV(RShCA;AuD;7K9EIj3yeT?@X_R$r2 delta 150 zcmWNJ%L)Nu0EItFsUJmVqn})JYZiuPh4@`U%0^1Fw6XLC$}7xkXi}cU8#$ZPxqO|( zCidgZ%#x*wp+<>19t~-eAuU4MZ0K-QbD_(X9ua+R47iJU;D4W{lJZ8R3CJ*J&qR2@ lnJ`XrKYyz8xy~09SW?7MW~F_tW-I4J?>H$%9O8HW^#|<-6;}WN diff --git a/target/classes/ru/egspt/UsersTableModel.class b/target/classes/ru/egspt/UsersTableModel.class new file mode 100644 index 0000000000000000000000000000000000000000..b3df93c83c9abd118e7d41327873adeab1fdacea GIT binary patch literal 1895 zcmZuxU2_^$7=8{c3v4z?O9HVrv1v^!kXo8pqc$HlQrn`Wv86#{{90g3HWKJ8OVf{A z|A-fkH@(mqi;gpPyz$1rghs8?Bn%h(Z&X+p`{8k8(CULor8C1h8ly|T)#&UuRSp@QF_Fc*K%Ayq0sTqF4;z3%pR(2H z*y}8xN*4;5VO}w}bx>&5>_-BkK+siHP@PEj7EMGEGpL-UDBczr?HiVfckr%2jFl84 z0#oUrO2=~=xpmjI9v7Xqw`|}lR-zzL6KaC}W)rJ8$C+ycq; zF!WJeKaNO3Fp$R$6E|hL2tx}s0|k5>#YX}sd)g^9J-cqZCW_eLEFMalHt#E%jbCr*~OwZueeJCaD2 zo?|LI-^Hn)Rf=h@320nnTyOtBdzm z^|kEu%wJdwJ;y?LN&697GI3H{3`>us*2VjOBHzV_zu{IXFlqg!+lS|o{`0$~?=->Q zw~{J=)xQ7t2RYWT8o?6j2j=rulfy04v64OG6e{hGa@GbPYp+k?@sX=0w vh7$V)z6^rb*o9QJo}H(Dd(t)3=?c-Vstmql52Yq$7{OPn@YjqE;hX;eoabjJ literal 0 HcmV?d00001