This commit is contained in:
2025-12-05 12:20:47 +03:00
parent 57673d0ee4
commit 05fce073f1
450 changed files with 58 additions and 58 deletions

View File

@@ -0,0 +1,561 @@
#include <QMessageBox>
#include "editortrainees.h"
#include "ui_editortrainees.h"
#include "dialogeditgroup.h"
#include "dialogedittrainee.h"
#include "specialmessagebox.h"
EditorTrainees::EditorTrainees(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent) :
TraineesView(connectorToServer, CommonView::TypeView::control, parent),
ui(new Ui::EditorTrainees),
dlgEditTrainee(nullptr),
dlgEditGroup(nullptr)
{
ui->setupUi(this);
connect(treeWidget, &QTreeWidget::currentItemChanged, this, &EditorTrainees::on_treeWidgetCurrentItemChanged);
ui->verticalLayout_1->addWidget(treeWidget);
this->adminMode = adminMode;
preparationTreeWidget();
//setNotLoggedInVisible(true);
loadTraineesFromDB();
if(adminMode)
ui->btnArchive->click();
waitAnimationWidget->setParent(this);
ui->btnNewGroup->setEnabled(true);
ui->btnDeleteGroup->setEnabled(false);
ui->btnNewTrainee->setEnabled(false);
ui->btnDeleteTrainee->setEnabled(false);
ui->btnToOrFromArchiveTrainee->setEnabled(false);
ui->btnEdit->setEnabled(false);
authComplited = true;
}
EditorTrainees::~EditorTrainees()
{
if(dlgEditTrainee)
{
dlgEditTrainee->close();
delete dlgEditTrainee;
dlgEditTrainee = nullptr;
}
if(dlgEditGroup)
{
dlgEditGroup->close();
delete dlgEditGroup;
dlgEditGroup = nullptr;
}
delete ui;
}
void EditorTrainees::closeEvent(QCloseEvent *event)
{
if(dlgEditTrainee)
dlgEditTrainee->close();
if(dlgEditGroup)
dlgEditGroup->close();
}
void EditorTrainees::on_btnNewGroup_clicked()
{
Group group;
Group group_edit;
if(editGroup(group, &group_edit))
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_NEW_GROUP, 0, &group_edit);
}
return;
}
void EditorTrainees::on_btnDeleteGroup_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent != nullptr)
{
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
if(treeItemParent == nullptr)
{//Выбрана группа
int id_group = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
if(connectorToServer->getListTraineesInGroup(id_group).count() > 0)
{
SpecMsgBox::CriticalClose(this, tr("The group is not empty.\nIt is not possible to delete a non-empty group."));
return;
}
else
{//Пустая группа
if(SpecMsgBox::WarningYesNo(this, tr("The deletion will be irrevocable.\nDelete it anyway?")) == QDialog::Accepted)
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_GROUP, id_group);
}
}
}
}
}
void EditorTrainees::on_btnNewTrainee_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent != nullptr)
{
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
if(treeItemParent == nullptr)
{//Выбрана группа. Можно добавить Обучаемого
int id_group = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
Trainee trainee;
Trainee trainee_edit;
trainee.setNeedSetPassword(true);
if(editTrainee(trainee, &trainee_edit))
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_NEW_TRAINEE, id_group, &trainee_edit);
}
return;
}
}
}
void EditorTrainees::on_btnDeleteTrainee_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent != nullptr)
{
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
if(treeItemParent != nullptr)
{//Выбран обучаемый
int id_trainee = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
int id_group = treeItemParent->text(ColumnsTreeUsers::clmn_ID).toInt();
if(connectorToServer->isLoggedInTrainee(id_trainee))
{//Обучаемый залогирован!
SpecMsgBox::CriticalClose(this, tr("You cannot delete a logged-in trainee."));
return;
}
if(SpecMsgBox::WarningYesNo(this, tr("The deletion will be irrevocable.\nDelete it anyway?")) == QDialog::Accepted)
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_TRAINEE, id_trainee);
}
}
}
}
void EditorTrainees::on_btnToOrFromArchiveTrainee_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent != nullptr)
{
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
if(treeItemParent != nullptr)
{//Выбран обучаемый
int id_trainee = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
Trainee trainee = connectorToServer->getTrainee(id_trainee);
if(trainee.getID() == 0)
return;
if(connectorToServer->isArchivedTrainee(id_trainee))
{//Архивный
trainee.setArchived(false);
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE, id_trainee, &trainee);
}
else
{//Не Архивный
if(connectorToServer->isLoggedInTrainee(id_trainee))
{//Обучаемый залогирован!
SpecMsgBox::CriticalClose(this, tr("You cannot archive a logged-in trainee."));
return;
}
trainee.setArchived(true);
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE, id_trainee, &trainee);
if(!archiveVisible)
ui->btnArchive->click();
}
}
}
}
void EditorTrainees::on_btnEdit_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent == nullptr)
return;
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
if(treeItemParent == nullptr)
{//Выбрана группа
int id_group = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
Group group = connectorToServer->getGroup(id_group);
if(group.getID() == 0)
return;
Group group_edit;
if(editGroup(group, &group_edit))
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_GROUP, id_group, &group_edit);
}
}
else
{//Выбран обучаемый
int id_trainee = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
if(connectorToServer->isLoggedInTrainee(id_trainee))
{//Обучаемый залогирован!
SpecMsgBox::CriticalClose(this, tr("You cannot edit a logged-in trainee."));
return;
}
Trainee trainee = connectorToServer->getTrainee(id_trainee);
if(trainee.getID() == 0)
return;
Trainee trainee_edit;
if(editTrainee(trainee, &trainee_edit))
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE, id_trainee, &trainee_edit);
}
}
}
void EditorTrainees::on_btnArchive_clicked()
{
bool state = ui->btnArchive->isChecked();
setArchiveVisible(state);
if(!state)
{
if(typeObject == TypeObject::objTrainee)
{
Trainee trainee = connectorToServer->getTrainee(lastCurrentID);
if(trainee.getID())
{
if(trainee.getArchived())
{
lastCurrentID = 0;
typeObject = TypeObject::objGroup;
}
}
else
{
lastCurrentID = 0;
typeObject = TypeObject::objGroup;
}
}
else if(typeObject == TypeObject::objGroup)
{
Group group = connectorToServer->getGroup(lastCurrentID);
if(group.getID())
{}
else
{
lastCurrentID = 0;
typeObject = TypeObject::objGroup;
}
}
else
{
lastCurrentID = 0;
typeObject = TypeObject::objGroup;
}
}
loadTraineesFromDB();
}
void EditorTrainees::on_treeWidgetCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
//Определяем доступность и функционал кнопок для выбранного элемента
if(current == nullptr)
{
ui->btnNewGroup->setEnabled(true);
ui->btnDeleteGroup->setEnabled(false);
ui->btnNewTrainee->setEnabled(false);
ui->btnDeleteTrainee->setEnabled(false);
ui->btnToOrFromArchiveTrainee->setEnabled(false);
ui->btnEdit->setEnabled(false);
return;
}
QTreeWidgetItem *treeItemParent = current->parent();
if(treeItemParent == nullptr)
{//Выбрана группа
int id_group = current->text(ColumnsTreeUsers::clmn_ID).toInt();
lastCurrentID = id_group;
typeObject = TypeObject::objGroup;
if(adminMode)
{
ui->btnNewGroup->setEnabled(true);
if(connectorToServer->getListTraineesInGroup(id_group).count() > 0)
{//Группа не пуста
ui->btnDeleteGroup->setEnabled(false);
}
else
{//Группа пуста
ui->btnDeleteGroup->setEnabled(true);
}
}
else
{
ui->btnNewGroup->setEnabled(false);
ui->btnDeleteGroup->setEnabled(false);
}
ui->btnNewTrainee->setEnabled(true);
ui->btnDeleteTrainee->setEnabled(false);
ui->btnToOrFromArchiveTrainee->setEnabled(false);
ui->btnEdit->setEnabled(true);
ui->btnArchive->setEnabled(true);
ui->btnToOrFromArchiveTrainee->setText(tr("To archive"));
ui->btnToOrFromArchiveTrainee->setIcon(QIcon(QStringLiteral(":/resources/icons/traineeArchive.png")));
}
else
{//Выбран обучаемый
int id_trainee = current->text(ColumnsTreeUsers::clmn_ID).toInt();
lastCurrentID = id_trainee;
typeObject = TypeObject::objTrainee;
ui->btnNewGroup->setEnabled(false);
ui->btnDeleteGroup->setEnabled(false);
ui->btnNewTrainee->setEnabled(false);
if(connectorToServer->isArchivedTrainee(id_trainee))
{//Архивный
//ui->btnDeleteTrainee->setEnabled(true);
ui->btnToOrFromArchiveTrainee->setText(tr("From archive"));
ui->btnToOrFromArchiveTrainee->setIcon(QIcon(QStringLiteral(":/resources/icons/traineeFromArchive.png")));
}
else
{//Не Архивный
//ui->btnDeleteTrainee->setEnabled(false);
ui->btnToOrFromArchiveTrainee->setText(tr("To archive"));
ui->btnToOrFromArchiveTrainee->setIcon(QIcon(QStringLiteral(":/resources/icons/traineeArchive.png")));
}
if(connectorToServer->isLoggedInTrainee(id_trainee))
{//Это залогированный! Удалять/Архивировать/Редактировать нельзя!
ui->btnDeleteTrainee->setEnabled(false);
ui->btnToOrFromArchiveTrainee->setEnabled(false);
ui->btnEdit->setEnabled(false);
}
else
{
ui->btnToOrFromArchiveTrainee->setEnabled(true);
if(connectorToServer->isArchivedTrainee(id_trainee))
ui->btnDeleteTrainee->setEnabled(true);
else
ui->btnDeleteTrainee->setEnabled(false);
ui->btnEdit->setEnabled(true);
}
//ui->btnToOrFromArchiveTrainee->setEnabled(true);
//ui->btnEdit->setEnabled(true);
ui->btnArchive->setEnabled(true);
}
}
bool EditorTrainees::verifyGroup(Group group)
{
//Проверка корректности имени
if(group.getName() == QStringLiteral("<group>"))
{//Имя не корректно!
SpecMsgBox::CriticalClose(this, tr("Unacceptable group name has been entered.\nThe changes will not be accepted."));
return false;
}
QList<Group> listGroups = connectorToServer->getListGroups();
for(Group exist_group : listGroups)
{
if(group.getName() == exist_group.getName() && group.getID() != exist_group.getID())
{//Имя уже существует
SpecMsgBox::CriticalClose(this, tr("An existing group name has been entered.\nThe changes will not be accepted."));
return false;
}
}
return true;
}
bool EditorTrainees::verifyTrainee(Trainee trainee)
{
//Проверка корректности логина, имени, пароля
if(trainee.getName() == QStringLiteral("<name>"))
{//Имя не корректно!
SpecMsgBox::CriticalClose(this, tr("Unacceptable trainee name has been entered.\nThe changes will not be accepted."));
return false;
}
if(trainee.getLogin() == QStringLiteral("<login>"))
{//Логин не корректен!
SpecMsgBox::CriticalClose(this, tr("Unacceptable trainee login has been entered.\nThe changes will not be accepted."));
return false;
}
if(trainee.getPassword() == QStringLiteral("<password>"))
{//Пароль не корректный!
SpecMsgBox::CriticalClose(this, tr("Unacceptable trainee password has been entered.\nThe changes will not be accepted."));
return false;
}
int user_I = connectorToServer->getIdInstructorByLogin(trainee.getLogin());
int user_T = connectorToServer->getIdTraineeByLogin(trainee.getLogin());
if((user_I && (user_I != trainee.getID())) || (user_T && (user_T != trainee.getID())))
{//Логин уже существует!
SpecMsgBox::CriticalClose(this, tr("An existing instructor or trainee login has been entered.\nThe changes will not be accepted."));
return 0;
}
return true;
}
bool EditorTrainees::editGroup(Group group, Group *group_edit)
{
dlgEditGroup = new DialogEditGroup(this);
dlgEditGroup->setWindowFlags(dlgEditGroup->windowFlags() & ~Qt::WindowContextHelpButtonHint);
dlgEditGroup->setGroup(group);
bool flStop = false;
bool res = false;
while (!flStop)
{
switch( dlgEditGroup->exec() )
{
case QDialog::Accepted:
{
*group_edit = dlgEditGroup->getGroup();
if(! verifyGroup(*group_edit))
{
dlgEditGroup->setGroup(*group_edit);
continue;
}
flStop = true;
res = true;
break;
}
case QDialog::Rejected:
flStop = true;
res = false;
break;
default:
flStop = true;
res = false;
break;
}
}
if(dlgEditGroup)
{
delete dlgEditGroup;
dlgEditGroup = nullptr;
}
return res;
}
bool EditorTrainees::editTrainee(Trainee trainee, Trainee *trainee_edit)
{
dlgEditTrainee = new DialogEditTrainee(adminMode, this);
dlgEditTrainee->setWindowFlags(dlgEditTrainee->windowFlags() & ~Qt::WindowContextHelpButtonHint);
dlgEditTrainee->setTrainee(trainee);
bool flStop = false;
bool res = false;
while (!flStop)
{
switch( dlgEditTrainee->exec() )
{
case QDialog::Accepted:
{
*trainee_edit = dlgEditTrainee->getTrainee();
if(! verifyTrainee(*trainee_edit))
{
dlgEditTrainee->setTrainee(*trainee_edit);
continue;
}
if(trainee_edit->getNeedSetPassword())
{
//Хэшируем пароль
trainee_edit->hashingPassword();
trainee_edit->setNeedSetPassword(false);
}
flStop = true;
res = true;
break;
}
case QDialog::Rejected:
flStop = true;
res = false;
break;
default:
flStop = true;
res = false;
break;
}
}
if(dlgEditTrainee)
{
delete dlgEditTrainee;
dlgEditTrainee = nullptr;
}
return res;
}