317 lines
8.9 KiB
C++
317 lines
8.9 KiB
C++
//
|
|
// Created by Krad on 2021/11/10.
|
|
//
|
|
#include "AccountFormDialog.h"
|
|
#include "ChangePasswordFormDialog.h"
|
|
#include <QVBoxLayout>
|
|
#include <QLabel>
|
|
#include <QUuid>
|
|
#include <QDebug>
|
|
#include <QToolButton>
|
|
#include <QPushButton>
|
|
#include <QLineEdit>
|
|
#include "event/EventCenter.h"
|
|
#include "log/UserOperationLog.h"
|
|
#include "db/SQLHelper.h"
|
|
#include "models/User.h"
|
|
#include "components/SlidePickerBox.h"
|
|
#include "SelectDialog.h"
|
|
#include "AlertDialog.h"
|
|
|
|
AccountFormDialog::AccountFormDialog(QWidget* parent, AccountEditMode mode, Qt::WindowFlags f) : GUIFormBaseDialog(parent, f) {
|
|
m_mode = mode;
|
|
QVBoxLayout* layout = new QVBoxLayout(formWidget);
|
|
layout->setSpacing(10);
|
|
// add title
|
|
QLabel* lbl_title = new QLabel(this);
|
|
lbl_title->setAlignment(Qt::AlignCenter);
|
|
lbl_title->setText(tr("Account"));
|
|
lbl_title->setObjectName("title");
|
|
layout->addWidget(lbl_title);
|
|
|
|
//add usercode
|
|
QLabel* lbl_UserCode = new QLabel(this);
|
|
lbl_UserCode->setText(tr("User ID"));
|
|
le_UserCode = new QLineEdit(this);
|
|
le_UserCode->setPlaceholderText(tr("Input User ID"));
|
|
if (m_mode != New)le_UserCode->setEnabled(false);
|
|
layout->addWidget(lbl_UserCode);
|
|
layout->addWidget(le_UserCode);
|
|
QLabel* lbl_endline1 = new QLabel(this);
|
|
lbl_endline1->setObjectName("endline");
|
|
layout->addWidget(lbl_endline1);
|
|
|
|
//add username
|
|
QLabel* lbl_UserName = new QLabel(this);
|
|
lbl_UserName->setText(tr("Name"));
|
|
le_UserName = new QLineEdit(this);
|
|
le_UserName->setPlaceholderText(tr("Input User name"));
|
|
layout->addWidget(lbl_UserName);
|
|
layout->addWidget(le_UserName);
|
|
QLabel* lbl_endline2 = new QLabel(this);
|
|
lbl_endline2->setObjectName("endline");
|
|
layout->addWidget(lbl_endline2);
|
|
|
|
//add password
|
|
QLabel* lbl_Pwd = new QLabel(this);
|
|
lbl_Pwd->setText(tr("Password"));
|
|
layout->addWidget(lbl_Pwd);
|
|
|
|
// add new mode
|
|
if (m_mode == New)
|
|
{
|
|
le_Pwd = new QLineEdit(this);
|
|
le_Pwd->setPlaceholderText(tr("Input password"));
|
|
le_Pwd->setEchoMode(QLineEdit::Password);
|
|
layout->addWidget(le_Pwd);
|
|
}
|
|
else {//edit mode
|
|
btn_Pwd = new QPushButton(this);
|
|
btn_Pwd->setText(tr(m_mode == Self ? "Change Password" : "Reset Password"));
|
|
layout->addWidget(btn_Pwd);
|
|
}
|
|
QLabel* lbl_endline3 = new QLabel(this);
|
|
lbl_endline3->setObjectName("endline");
|
|
layout->addWidget(lbl_endline3);
|
|
|
|
if (m_mode == Self)
|
|
{
|
|
//add logout
|
|
QLabel* lbl_Logout = new QLabel(this);
|
|
lbl_Logout->setText(tr("Logout"));
|
|
QPushButton* btn_Logout = new QPushButton(this);
|
|
btn_Logout->setText(tr("Logout"));
|
|
layout->addWidget(lbl_Logout);
|
|
layout->addWidget(btn_Logout);
|
|
QLabel* lbl_endline0 = new QLabel(this);
|
|
lbl_endline0->setObjectName("endline");
|
|
layout->addWidget(lbl_endline0);
|
|
// load current user data
|
|
if (User::Current())
|
|
{
|
|
le_UserCode->setText(User::Current()->getUserCode());
|
|
le_UserName->setText(User::Current()->getUserName());
|
|
m_UserID = User::Current()->getUserID();
|
|
m_UserPwd = User::Current()->getPassword();
|
|
}
|
|
connect(btn_Pwd, &QPushButton::clicked, [t = this]() {
|
|
ChangePasswordFormDialog dia(t->parentWidget());
|
|
dia.setWindowModality(Qt::WindowModal);
|
|
dia.exec();
|
|
});
|
|
connect(btn_Logout, &QAbstractButton::clicked, [=]() {
|
|
this->accept();
|
|
LOG_USER_OPERATION(Logout);
|
|
EventCenter::Default()->triggerEvent(GUIEvents::RequestLogin, nullptr, nullptr);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
//add change role
|
|
QLabel* lbl_Role = new QLabel(this);
|
|
lbl_Role->setText(tr("Change Role"));
|
|
btn_Role = new QPushButton(this);
|
|
layout->addWidget(lbl_Role);
|
|
layout->addWidget(btn_Role);
|
|
QLabel* lbl_endline0 = new QLabel(this);
|
|
lbl_endline0->setObjectName("endline");
|
|
layout->addWidget(lbl_endline0);
|
|
//set default value
|
|
if (m_mode == New) {
|
|
btn_Role->setText(tr("doctor"));
|
|
m_RoleID = User::getRoleID("doctor");
|
|
}
|
|
else {
|
|
connect(btn_Pwd, &QAbstractButton::clicked, [=]() {
|
|
AlertDialog dialog(this);
|
|
dialog.setButtonMode(OkAndCancel);
|
|
dialog.setWindowModality(Qt::WindowModal);
|
|
dialog.setAlertMessage(tr("Reset password to \"123456\" ?"));
|
|
if (dialog.exec() == Accepted)
|
|
{
|
|
User user;
|
|
dialog.setButtonMode(OkOnly);
|
|
if (!User::getUser(m_UserID, user)) {
|
|
dialog.setAlertMessage(tr("Inner error, can't find reference user!"));
|
|
dialog.exec();
|
|
return;
|
|
}
|
|
if (!user.resetPassword())
|
|
{
|
|
dialog.setAlertMessage(tr("Submit change to database fail!"));
|
|
dialog.exec();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
connect(btn_Role, &QAbstractButton::clicked, [=]() {
|
|
SelectDialog selectDialog(this);
|
|
selectDialog.setAvailableDates(User::getAllRoleName());
|
|
selectDialog.setSelectedValue(btn_Role->text());
|
|
selectDialog.setWindowModality(Qt::WindowModal);
|
|
// submit change
|
|
if (selectDialog.exec() == Accepted)
|
|
{
|
|
if (selectDialog.getSelectedValue() != btn_Role->text())
|
|
{
|
|
QString newRoleID = User::getRoleID(selectDialog.getSelectedValue());
|
|
btn_Role->setText(selectDialog.getSelectedValue());
|
|
m_RoleID = newRoleID;
|
|
qDebug() << "new Role ID:" << newRoleID;
|
|
this->roleChanged = true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
//add Comment
|
|
QLabel* lbl_Comment = new QLabel(this);
|
|
lbl_Comment->setText(tr("Comment"));
|
|
le_Comment = new QLineEdit(this);
|
|
layout->addWidget(lbl_Comment);
|
|
layout->addWidget(le_Comment);
|
|
QLabel* lbl_endline0 = new QLabel(this);
|
|
lbl_endline0->setObjectName("endline");
|
|
layout->addWidget(lbl_endline0);
|
|
|
|
lbl_error = new QLabel(this);
|
|
lbl_error->setObjectName("warn");
|
|
lbl_error->setVisible(false);
|
|
layout->addWidget(lbl_error);
|
|
connect(le_Comment, &QLineEdit::textChanged, [=](const QString& text) {
|
|
commentChanged = true;
|
|
});
|
|
connect(le_UserName, &QLineEdit::textChanged, [=](const QString& text) {
|
|
m_NewUserName = text;
|
|
userNameChanged = true;
|
|
});
|
|
}
|
|
|
|
AccountFormDialog::~AccountFormDialog() {
|
|
|
|
}
|
|
|
|
bool AccountFormDialog::updateReferenceData() {
|
|
if (m_mode == Self) {
|
|
if (!this->userNameChanged && !this->commentChanged) return true;
|
|
if (!this->userNameChanged) {
|
|
if (m_NewUserName.isEmpty()) {
|
|
warn(tr("User Name can't be empty!"));
|
|
return false;
|
|
}
|
|
User::Current()->setUserName(m_NewUserName);
|
|
}
|
|
if (!this->commentChanged) User::Current()->setUserName(le_Comment->text());
|
|
bool ret = User::Current()->submitChange();
|
|
if (ret) {
|
|
hideWarn();
|
|
LOG_USER_OPERATION(ChangeUserName);
|
|
}
|
|
else {
|
|
warn(tr("Submit change to database fail!"));
|
|
}
|
|
return ret;
|
|
}
|
|
else if (m_mode == Admin) {
|
|
if (!this->userNameChanged && !this->roleChanged) return true;
|
|
User user;
|
|
if (!User::getUser(m_UserID, user)) return true;
|
|
if (this->userNameChanged) {
|
|
if (m_NewUserName.isEmpty()) {
|
|
warn(tr("User Name can't be empty!"));
|
|
return false;
|
|
}
|
|
user.setUserName(m_NewUserName);
|
|
}
|
|
if (this->roleChanged) user.setRoleID(m_RoleID);
|
|
if (!this->commentChanged) user.setComment(le_Comment->text());
|
|
bool ret = user.submitChange();
|
|
if (ret) {
|
|
LOG_USER_OPERATION(AdminChangeAcountInformation);
|
|
}
|
|
return ret;
|
|
}
|
|
else {
|
|
//add new
|
|
User user;
|
|
if (le_UserCode->text().isEmpty()) {
|
|
warn(tr("User ID can't be empty!"));
|
|
return false;
|
|
}
|
|
if (le_UserName->text().isEmpty()) {
|
|
warn(tr("User Name can't be empty!"));
|
|
return false;
|
|
}
|
|
if (le_Pwd->text().isEmpty()) {
|
|
warn(tr("Password can't be empty!"));
|
|
return false;
|
|
}
|
|
if (!refmodel) {
|
|
warn(tr("Inner error ,unset data model!"));
|
|
return false;
|
|
}
|
|
if (User::existsUser(le_UserCode->text())) {
|
|
warn(tr("User Id exists!"));
|
|
return false;
|
|
}
|
|
hideWarn();
|
|
user.setUserName(le_UserName->text());
|
|
user.setPassword(User::getEncryptedPassword(le_Pwd->text()));
|
|
user.setRoleID(m_RoleID);
|
|
user.setComment(le_Comment->text());
|
|
// User::insertUser(le_UserCode->text(),user);
|
|
|
|
refmodel->insertRow(0);
|
|
refmodel->setData(refmodel->index(0, 0), QUuid::createUuid().toString());
|
|
refmodel->setData(refmodel->index(0, 1), le_UserCode->text());
|
|
#define USER_READONLY_PROPERTY(name) name,
|
|
#define USER_PROPERTY(name)\
|
|
USER_READONLY_PROPERTY(name)
|
|
|
|
enum user_index {
|
|
USER_PROPERTIES_MACRO()
|
|
};
|
|
#undef USER_READONLY_PROPERTY
|
|
#undef USER_PROPERTY
|
|
|
|
#define USER_READONLY_PROPERTY(name)
|
|
#define USER_PROPERTY(name)\
|
|
USER_READONLY_PROPERTY(name)\
|
|
refmodel->setData(refmodel->index(0, name),user.get##name());
|
|
USER_PROPERTIES_MACRO()
|
|
#undef USER_READONLY_PROPERTY
|
|
#undef USER_PROPERTY
|
|
|
|
if (refmodel->submit()) {
|
|
hideWarn();
|
|
return true;
|
|
}
|
|
else {
|
|
warn(tr("Submit to data base fail!"));
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void AccountFormDialog::setAccountInformation(const QMap<QString, QVariant>& values) {
|
|
le_UserCode->setText(values["UserCode"].toString());
|
|
le_UserName->setText(values["UserName"].toString());
|
|
le_Comment->setText(values["Comment"].toString());
|
|
m_UserID = values["UserID"].toString();
|
|
m_UserPwd = values["Password"].toString();
|
|
if (btn_Role) {
|
|
m_RoleID = values["RoleID"].toString();
|
|
btn_Role->setText(User::getRoleName(m_RoleID));
|
|
}
|
|
}
|
|
|
|
void AccountFormDialog::warn(QString msg) {
|
|
lbl_error->setText(msg);
|
|
lbl_error->setVisible(true);
|
|
}
|
|
|
|
void AccountFormDialog::hideWarn() {
|
|
this->lbl_error->setVisible(false);
|
|
}
|