Add fully-functional administration panel for administrators and dispatchers
This commit is contained in:
parent
bf599549ea
commit
ff6901e3a9
22 changed files with 1257 additions and 42 deletions
250
iFacility/administrationpanel.cpp
Normal file
250
iFacility/administrationpanel.cpp
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
#include "administrationpanel.h"
|
||||
#include "ui_administrationpanel.h"
|
||||
|
||||
AdministrationPanel::AdministrationPanel(QWidget *parent) :
|
||||
QMainWindow(parent), ui(new Ui::AdministrationPanel) {
|
||||
ui->setupUi(this);
|
||||
|
||||
connect(this, &AdministrationPanel::invalidateTables,
|
||||
this, &AdministrationPanel::onTablesInvalidation);
|
||||
|
||||
avm = new AdministrationViewModel(this);
|
||||
ui->administrationView->setModel(avm);
|
||||
wvm = new WorkersViewModel(this);
|
||||
ui->workersView->setModel(wvm);
|
||||
pvm = new ProfessionsViewModel(this);
|
||||
ui->professionsView->setModel(pvm);
|
||||
|
||||
emit invalidateTables();
|
||||
}
|
||||
|
||||
AdministrationPanel::~AdministrationPanel() {
|
||||
delete ui;
|
||||
|
||||
delete avm;
|
||||
delete wvm;
|
||||
delete pvm;
|
||||
}
|
||||
|
||||
void AdministrationPanel::setUser(User *user) {
|
||||
mUser = user;
|
||||
ui->user->setText(user->getFullNameShortForm());
|
||||
ui->administrationGroup->setVisible(user->getUserType() == UserType::ADMINISTRATOR);
|
||||
}
|
||||
|
||||
void AdministrationPanel::resizeEvent(QResizeEvent *event) {
|
||||
int cellWidth = 60;
|
||||
|
||||
ui->administrationView->setColumnWidth(0, cellWidth*4);
|
||||
ui->administrationView->setColumnWidth(1, cellWidth*1);
|
||||
ui->administrationView->setColumnWidth(2, cellWidth*4);
|
||||
ui->administrationView->setColumnWidth(3, cellWidth*2);
|
||||
|
||||
ui->workersView->setColumnWidth(0, cellWidth*4);
|
||||
ui->workersView->setColumnWidth(1, cellWidth*1);
|
||||
ui->workersView->setColumnWidth(2, cellWidth*4);
|
||||
ui->workersView->setColumnWidth(3, cellWidth*4);
|
||||
ui->workersView->setColumnWidth(4, cellWidth*4);
|
||||
ui->workersView->setColumnWidth(5, cellWidth*4);
|
||||
ui->workersView->setColumnWidth(6, cellWidth*4);
|
||||
|
||||
QMainWindow::resizeEvent(event);
|
||||
}
|
||||
|
||||
void AdministrationPanel::doLogout() {
|
||||
close();
|
||||
}
|
||||
|
||||
void AdministrationPanel::addAdministration() {
|
||||
QStringList items = {
|
||||
"Administrator",
|
||||
"Dispatcher"
|
||||
};
|
||||
bool ok;
|
||||
QString sel = QInputDialog::getItem(this, "Administration type", "", items, 0, false, &ok);
|
||||
if (ok) {
|
||||
UserType t = sel == "Administrator"? UserType::ADMINISTRATOR : UserType::DISPATCHER;
|
||||
User *user = new User();
|
||||
RegistrationDialog rd(this);
|
||||
rd.setEditMode(false);
|
||||
rd.setUser(user);
|
||||
rd.lockUserType(t);
|
||||
rd.setWindowTitle("New administration");
|
||||
if (rd.exec() == RegistrationDialog::Accepted) {
|
||||
Database::instance()->addUser(*user);
|
||||
emit invalidateTables();
|
||||
return;
|
||||
}
|
||||
}
|
||||
QMessageBox::critical(this, "Error", "Aborted by user");
|
||||
}
|
||||
|
||||
void AdministrationPanel::addWorker() {
|
||||
User *user = new User();
|
||||
RegistrationDialog rd(this);
|
||||
rd.setEditMode(false);
|
||||
rd.setUser(user);
|
||||
rd.lockUserType(UserType::WORKER);
|
||||
rd.setWindowTitle("New worker");
|
||||
if (rd.exec() == RegistrationDialog::Accepted) {
|
||||
Database::instance()->addUser(*user);
|
||||
emit invalidateTables();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void AdministrationPanel::addProfession() {
|
||||
QString title = QInputDialog::getText(this, "Input", "Profession title").trimmed();
|
||||
if (!title.isEmpty()) {
|
||||
Profession p = Profession::createProfession(title);
|
||||
bool ok = Database::instance()->addProfession(p);
|
||||
if (ok) {
|
||||
emit invalidateTables();
|
||||
}
|
||||
else {
|
||||
QMessageBox::critical(this, "Error", "You are trying to add the same job twice");
|
||||
}
|
||||
return;
|
||||
}
|
||||
QMessageBox::critical(this, "Error", "Aborted by user");
|
||||
}
|
||||
|
||||
void AdministrationPanel::editAdministration() {
|
||||
auto rows = ui->administrationView->selectionModel()->selectedRows();
|
||||
if (rows.isEmpty() || rows.size() > 1) {
|
||||
return;
|
||||
}
|
||||
UID aUID = avm->index(rows[0].row(), 0).data().toString();
|
||||
if (aUID == mUser->uID()) {
|
||||
QMessageBox::critical(this, "Error", "You cannot edit yourself.");
|
||||
return;
|
||||
}
|
||||
editUser(aUID);
|
||||
}
|
||||
|
||||
void AdministrationPanel::editWorker() {
|
||||
auto rows = ui->workersView->selectionModel()->selectedRows();
|
||||
if (rows.isEmpty() || rows.size() > 1) {
|
||||
return;
|
||||
}
|
||||
UID wUID = wvm->index(rows[0].row(), 0).data().toString();
|
||||
editUser(wUID);
|
||||
}
|
||||
|
||||
void AdministrationPanel::editUser(UID uid) {
|
||||
User *user = Database::instance()->getUser(uid);
|
||||
if (user == nullptr) {
|
||||
QMessageBox::critical(this, "Error", "USer not found");
|
||||
return;
|
||||
}
|
||||
RegistrationDialog rd(this);
|
||||
rd.setEditMode(true);
|
||||
rd.setUser(user);
|
||||
rd.lockUserType(user->getUserType());
|
||||
rd.setWindowTitle("Edit user");
|
||||
if (rd.exec() == RegistrationDialog::Accepted) {
|
||||
Database::instance()->addUser(*user);
|
||||
emit invalidateTables();
|
||||
}
|
||||
}
|
||||
|
||||
void AdministrationPanel::editProfession() {
|
||||
QStringList professions;
|
||||
foreach (auto prof, Database::instance()->professions()) {
|
||||
professions << prof.title() + "|" + prof.pID().toString();
|
||||
}
|
||||
if (professions.isEmpty()) {
|
||||
QMessageBox::critical(this, "Error", "No professions found");
|
||||
return;
|
||||
}
|
||||
bool ok;
|
||||
QString p = QInputDialog::getItem(this, "Choose profession", "Profession title",
|
||||
professions, 0, false, &ok);
|
||||
if (ok) {
|
||||
PID pid = p.split("|").last();
|
||||
QString title = QInputDialog::getText(this, "Input", "New title").trimmed();
|
||||
if (!title.isEmpty()) {
|
||||
Database::instance()->getProfession(pid)->setTitle(title);
|
||||
emit invalidateTables();
|
||||
return;
|
||||
}
|
||||
}
|
||||
QMessageBox::critical(this, "Error", "Aborted by user");
|
||||
}
|
||||
|
||||
void AdministrationPanel::removeAdministration() {
|
||||
auto rows = ui->administrationView->selectionModel()->selectedRows();
|
||||
if (rows.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
QMessageBox remconf(this);
|
||||
remconf.setIcon(QMessageBox::Question);
|
||||
remconf.setWindowTitle("Remove confirmation");
|
||||
remconf.setText("Are you sure you want to remove this worker?");
|
||||
remconf.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
|
||||
remconf.setDefaultButton(QMessageBox::No);
|
||||
if (remconf.exec() == QMessageBox::No) {
|
||||
return;
|
||||
}
|
||||
for (int i = rows.size() - 1; i >= 0; i--) {
|
||||
UID aUID = avm->index(rows[i].row(), 0).data().toString();
|
||||
if (aUID == mUser->uID()) {
|
||||
QMessageBox::critical(this, "Error", "You cannot remove yourself.");
|
||||
}
|
||||
else {
|
||||
Database::instance()->removeUser(aUID);
|
||||
}
|
||||
}
|
||||
emit invalidateTables();
|
||||
}
|
||||
|
||||
void AdministrationPanel::removeWorker() {
|
||||
auto rows = ui->workersView->selectionModel()->selectedRows();
|
||||
if (rows.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
QMessageBox remconf(this);
|
||||
remconf.setIcon(QMessageBox::Question);
|
||||
remconf.setWindowTitle("Remove confirmation");
|
||||
remconf.setText("Are you sure you want to remove this worker?");
|
||||
remconf.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
|
||||
remconf.setDefaultButton(QMessageBox::No);
|
||||
if (remconf.exec() == QMessageBox::No) {
|
||||
return;
|
||||
}
|
||||
for (int i = rows.size() - 1; i >= 0; i--) {
|
||||
UID wUID = wvm->index(rows[i].row(), 0).data().toString();
|
||||
Database::instance()->removeUser(wUID);
|
||||
}
|
||||
emit invalidateTables();
|
||||
}
|
||||
|
||||
void AdministrationPanel::removeProfession() {
|
||||
QStringList professions;
|
||||
foreach (auto prof, Database::instance()->professions()) {
|
||||
professions << prof.title() + "|" + prof.pID().toString();
|
||||
}
|
||||
if (professions.isEmpty()) {
|
||||
QMessageBox::critical(this, "Error", "No professions found");
|
||||
return;
|
||||
}
|
||||
bool ok;
|
||||
QString p = QInputDialog::getItem(this, "Choose profession", "Profession title",
|
||||
professions, 0, false, &ok);
|
||||
if (ok) {
|
||||
PID pid = p.split("|").last();
|
||||
ok = Database::instance()->removeProfession(pid);
|
||||
if (ok) {
|
||||
emit invalidateTables();
|
||||
return;
|
||||
}
|
||||
}
|
||||
QMessageBox::critical(this, "Error", "Aborted by user or "
|
||||
"workers depend on selected profession");
|
||||
}
|
||||
|
||||
void AdministrationPanel::onTablesInvalidation() {
|
||||
avm->invalidateData();
|
||||
wvm->invalidateData();
|
||||
pvm->invalidateData();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue