/* *openPilot Log - A FOSS Pilot Logbook Application *Copyright (C) 2020 Felix Turowsky * *This program is free software: you can redistribute it and/or modify *it under the terms of the GNU General Public License as published by *the Free Software Foundation, either version 3 of the License, or *(at your option) any later version. * *This program is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *GNU General Public License for more details. * *You should have received a copy of the GNU General Public License *along with this program. If not, see . */ #include "newpilotdialog.h" #include "ui_newpilot.h" #include "src/testing/adebug.h" /* Examples for names around the world: * José Eduardo Santos Tavares Melo Silva * María José Carreño Quiñones * 毛泽东先生 (Mao Ze Dong xiān shēng) * Борис Николаевич Ельцин (Boris Nikolayevich Yeltsin) * John Q. Public * Abu Karim Muhammad al-Jamil ibn Nidal ibn Abdulaziz al-Filistini * Nguyễn Tấn Dũng * 東海林賢蔵 * Chris van de Hoopen * Karl-Gustav von Meiershausen * Mathias d'Arras * Martin Luther King, Jr. */ static const auto NAME_RX = QLatin1String("(\\p{L}+(\\s|'|\\-)?\\s?(\\p{L}+)?\\s?)"); static const auto FIRSTNAME_VALID = QPair { "firstnameLineEdit", QRegularExpression(NAME_RX + NAME_RX + NAME_RX)}; static const auto LASTNAME_VALID = QPair { "lastnameLineEdit", QRegularExpression(NAME_RX + NAME_RX + NAME_RX)}; static const auto PHONE_VALID = QPair { "phoneLineEdit", QRegularExpression("^[+]{0,1}[0-9\\-\\s]+")}; static const auto EMAIL_VALID = QPair { "emailLineEdit", QRegularExpression( "\\A[a-z0-9!#$%&'*+/=?^_‘{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_‘{|}~-]+)*@" "(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\z")}; static const auto COMPANY_VALID = QPair { "companyLineEdit", QRegularExpression("\\w+(\\s|\\-)?(\\w+(\\s|\\-)?)?(\\w+(\\s|\\-)?)?")}; static const auto EMPLOYEENR_VALID = QPair { "employeeidLineEdit", QRegularExpression("\\w+")}; static const auto LINE_EDIT_VALIDATORS = QVector{ FIRSTNAME_VALID, LASTNAME_VALID, PHONE_VALID, EMAIL_VALID, COMPANY_VALID, EMPLOYEENR_VALID }; using namespace experimental; // For creating a new entry NewPilotDialog::NewPilotDialog(QWidget *parent) : QDialog(parent), ui(new Ui::NewPilot) { DEB("New NewPilotDialog (newEntry)"); setup(); pilotEntry = APilotEntry(); ui->lastnameLineEdit->setFocus(); } NewPilotDialog::NewPilotDialog(int rowId, QWidget *parent) : QDialog(parent), ui(new Ui::NewPilot) { DEB("New NewPilotDialog (editEntry)"); setup(); pilotEntry = aDB()->getPilotEntry(rowId); DEB("Pilot Entry position: " << pilotEntry.getPosition()); formFiller(); ui->lastnameLineEdit->setFocus(); } NewPilotDialog::~NewPilotDialog() { DEB("Deleting New NewPilotDialog"); delete ui; } void NewPilotDialog::setup() { ui->setupUi(this); DEB("Setting up Validators..."); for (const auto& pair : LINE_EDIT_VALIDATORS) { auto line_edit = parent()->findChild(pair.first); if (line_edit != nullptr) { auto validator = new QRegularExpressionValidator(pair.second,line_edit); line_edit->setValidator(validator); } else { DEB("Error: Line Edit not found: "<< pair.first << " - skipping."); } } DEB("Setting up completer..."); auto completer = new QCompleter(aDB()->getCompletionList(ADatabaseTarget::companies), ui->companyLineEdit); completer->setCompletionMode(QCompleter::InlineCompletion); completer->setCaseSensitivity(Qt::CaseSensitive); ui->companyLineEdit->setCompleter(completer); } void NewPilotDialog::on_buttonBox_accepted() { if (ui->lastnameLineEdit->text().isEmpty() || ui->firstnameLineEdit->text().isEmpty()) { auto mb = QMessageBox(this); mb.setText("Last Name and First Name are required."); mb.show(); } else { submitForm(); } } void NewPilotDialog::formFiller() { DEB("Filling Form..."); auto line_edits = this->findChildren(); for (const auto &le : line_edits) { auto key = le->objectName().remove("LineEdit"); le->setText(pilotEntry.getData().value(key).toString()); } } void NewPilotDialog::submitForm() { DEB("Collecting User Input..."); TableData new_data; auto line_edits = this->findChildren(); for(auto& le : line_edits) { auto key = le->objectName().remove("LineEdit"); auto value = le->text(); new_data.insert(key, value); } pilotEntry.setData(new_data); DEB("Pilot entry position: " << pilotEntry.getPosition()); DEB("Pilot entry data: " << pilotEntry.getData()); if (!aDB()->commit(pilotEntry)) { auto message_box = QMessageBox(this); message_box.setText("The following error has ocurred:\n\n" + aDB()->lastError.text() + "\n\nThe entry has not been saved."); message_box.exec(); return; } else { QDialog::accept(); } }