From f1a436ead0a343e56e4f5aef12fc531cfa89e20d Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Tue, 17 Feb 2026 11:38:38 +0100 Subject: [PATCH 1/4] Added ShareType changes to the conditions to emit nExpectedBiddingsChanged. --- libs/BeetRoundCore/model/tablemodel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/BeetRoundCore/model/tablemodel.cpp b/libs/BeetRoundCore/model/tablemodel.cpp index 774f4b2..ba7bab9 100644 --- a/libs/BeetRoundCore/model/tablemodel.cpp +++ b/libs/BeetRoundCore/model/tablemodel.cpp @@ -388,7 +388,8 @@ void TableModel::execEditItemData(const int row, const QMap& chan emit dataChanged(firstIndex, lastIndex, roles.toVector()); // NEXT check which roles are changed & trigger only changed properties - if (roles.contains(BiddingTypeRole) || roles.contains(ShareAmountRole)) { + if (roles.contains(BiddingTypeRole) || roles.contains(ShareAmountRole) || + roles.contains(ShareTypeRole)) { emit nExpectedBiddingsChanged(); } if (roles.contains(ShareAmountRole) || roles.contains(ShareTypeRole)) { From 7a8859843e5350374544f23dfabfe7b8c4854670 Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Tue, 17 Feb 2026 11:42:29 +0100 Subject: [PATCH 2/4] Added onlineID and accessUrl widgets to the edit item dialog layout. No functionality yet. --- .../dialogs/edititemdialog.cpp | 20 +-- UIs/BeetRoundWidgets/dialogs/edititemdialog.h | 22 --- .../views/itemdetailmapper.cpp | 136 ++++++++++++------ UIs/BeetRoundWidgets/views/itemdetailmapper.h | 24 +++- 4 files changed, 118 insertions(+), 84 deletions(-) diff --git a/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp b/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp index 47041ce..488919b 100644 --- a/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp +++ b/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp @@ -8,8 +8,7 @@ EditItemDialog::EditItemDialog(QTableView* tableView, QWidget* parent) : AbstractDialog(QDialogButtonBox::Ok, parent) - , m_tableView(tableView) - , m_qrCodeDisplay(new QLabel("QR Code")) {} + , m_tableView(tableView) {} void EditItemDialog::createContent() { if (m_contentContainer) { @@ -26,10 +25,6 @@ void EditItemDialog::createContent() { m_detailMapper->setModelMappings(m_tableView); innerLayout->addWidget(m_detailMapper); - updateQRCode(); - connect(m_detailMapper, &ItemDetailMapper::contentChanged, this, &EditItemDialog::updateQRCode); - innerLayout->addWidget(m_qrCodeDisplay); - m_outerLayout->insertWidget(0, m_contentContainer); } @@ -42,16 +37,3 @@ void EditItemDialog::reject() { m_detailMapper->revert(); QDialog::reject(); } - -void EditItemDialog::updateQRCode(const QString text) { - QImage unscaledImage; - if (text.isEmpty()) { - unscaledImage = QImage("://no-picture-taking.png"); - } else { - unscaledImage = m_generator.generateQr(text); - } - QImage image = unscaledImage.scaled(250, 250); - - m_qrCodeDisplay->setPixmap(QPixmap::fromImage(image)); - m_qrCodeDisplay->setToolTip(text); -} diff --git a/UIs/BeetRoundWidgets/dialogs/edititemdialog.h b/UIs/BeetRoundWidgets/dialogs/edititemdialog.h index e485f45..67bf01e 100644 --- a/UIs/BeetRoundWidgets/dialogs/edititemdialog.h +++ b/UIs/BeetRoundWidgets/dialogs/edititemdialog.h @@ -1,7 +1,6 @@ #ifndef EDITITEMDIALOG_H #define EDITITEMDIALOG_H -#include "QrCodeGenerator.h" #include "abstractdialog.h" class QDoubleSpinBox; @@ -24,30 +23,9 @@ class EditItemDialog : public AbstractDialog { void accept() override; void reject() override; - private slots: - void updateQRCode(const QString text = ""); - private: QTableView* m_tableView = nullptr; ItemDetailMapper* m_detailMapper; - - QLabel* m_nameLabel = nullptr; - QLineEdit* m_nameEdit = nullptr; - - QLabel* m_descriptionLabel = nullptr; - QLineEdit* m_descriptionEdit = nullptr; - - QLabel* m_infoLabel = nullptr; - QLineEdit* m_infoEdit = nullptr; - - QLabel* m_amountLabel = nullptr; - QSpinBox* m_amountBox = nullptr; - - QLabel* m_factorLabel = nullptr; - QDoubleSpinBox* m_factorBox = nullptr; - - QLabel* m_qrCodeDisplay = nullptr; - QrCodeGenerator m_generator; }; #endif // EDITITEMDIALOG_H diff --git a/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp b/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp index 28a2f59..11a7e95 100644 --- a/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp +++ b/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp @@ -15,7 +15,8 @@ #include "model/metadata.h" ItemDetailMapper::ItemDetailMapper(QWidget* parent) - : QWidget{parent} { + : QWidget{parent} + , m_qrCodeDisplay(new QLabel("QR Code")) { /// model mapping m_mapper = std::make_unique(this); /// BUG: If multiple columns are changed not all changes are applied. @@ -35,7 +36,8 @@ ItemDetailMapper::ItemDetailMapper(QWidget* parent) connect(m_nextButton, &QAbstractButton::clicked, this, &ItemDetailMapper::toNext); /// the individual widgets - // REFACTOR deduce label names and types from meta data & use a factory + // REFACTOR deduce types from meta data & use a factory + /// left layout m_numberLabel = new QLabel(GET_HEADER_FOR_COLUMN(0)); m_numberBox = new QSpinBox(); m_numberBox->setMaximum(1000); @@ -86,36 +88,74 @@ ItemDetailMapper::ItemDetailMapper(QWidget* parent) m_mailEdit->setMinimumWidth(200); m_mailLabel->setBuddy(m_mailEdit); - QGridLayout* layout = new QGridLayout(); - layout->addWidget(m_numberLabel, 0, 0, 1, 1); - layout->addWidget(m_numberBox, 0, 1, 1, 1); - layout->addWidget(m_lastNameLabel, 1, 0, 1, 1); - layout->addWidget(m_lastNameEdit, 1, 1, 1, 1); - layout->addWidget(m_firstNameLabel, 2, 0, 1, 1); - layout->addWidget(m_firstNameEdit, 2, 1, 1, 1); - layout->addWidget(m_shareTypeLabel, 3, 0, 1, 1); - layout->addWidget(m_shareTypeBox, 3, 1, 1, 1); - layout->addWidget(m_amountLabel, 4, 0, 1, 1); - layout->addWidget(m_amountSpinBox, 4, 1, 1, 1); - layout->addWidget(m_biddingTypeLabel, 5, 0, 1, 1); - layout->addWidget(m_biddingTypeBox, 5, 1, 1, 1); - layout->addWidget(m_bidding1Label, 6, 0, 1, 1); - layout->addWidget(m_bidding1SpinBox, 6, 1, 1, 1); - layout->addWidget(m_bidding2Label, 7, 0, 1, 1); - layout->addWidget(m_bidding2SpinBox, 7, 1, 1, 1); - layout->addWidget(m_bidding3Label, 8, 0, 1, 1); - layout->addWidget(m_bidding3SpinBox, 8, 1, 1, 1); - layout->addWidget(m_depotWish1Label, 9, 0, 1, 1); - layout->addWidget(m_depotWish1Edit, 9, 1, 1, 1); - layout->addWidget(m_depotWish2Label, 10, 0, 1, 1); - layout->addWidget(m_depotWish2Edit, 10, 1, 1, 1); - layout->addWidget(m_mailLabel, 11, 0, 1, 1); - layout->addWidget(m_mailEdit, 11, 1, 1, 1); + /// right layout + m_createOnlineAccountButton = new QPushButton(tr("&Create account")); + m_sendInviteMailButton = new QPushButton(tr("&Send invite")); - layout->addWidget(m_previousButton, 12, 0, 1, 1); - layout->addWidget(m_nextButton, 12, 1, 1, 1); + m_onlineIdLabel = new QLabel(GET_HEADER_FOR_COLUMN(12)); + m_onlineIdDisplay = new QLineEdit(); + m_onlineIdDisplay->setReadOnly(true); + m_onlineIdLabel->setBuddy(m_onlineIdDisplay); - setLayout(layout); + m_accessCodeLabel = new QLabel(GET_HEADER_FOR_COLUMN(13)); + m_accessCodeDisplay = new QLineEdit(); + m_accessCodeDisplay->setReadOnly(true); + m_accessCodeLabel->setBuddy(m_onlineIdDisplay); + + updateQRCode(); + connect(this, &ItemDetailMapper::contentChanged, this, &ItemDetailMapper::updateQRCode); + + m_accessUrlDisplay = new QLineEdit(); + m_accessUrlDisplay->setReadOnly(true); + + QGridLayout* leftLayout = new QGridLayout(); + leftLayout->addWidget(m_numberLabel, 0, 0, 1, 1); + leftLayout->addWidget(m_numberBox, 0, 1, 1, 1); + leftLayout->addWidget(m_lastNameLabel, 1, 0, 1, 1); + leftLayout->addWidget(m_lastNameEdit, 1, 1, 1, 1); + leftLayout->addWidget(m_firstNameLabel, 2, 0, 1, 1); + leftLayout->addWidget(m_firstNameEdit, 2, 1, 1, 1); + leftLayout->addWidget(m_shareTypeLabel, 3, 0, 1, 1); + leftLayout->addWidget(m_shareTypeBox, 3, 1, 1, 1); + leftLayout->addWidget(m_amountLabel, 4, 0, 1, 1); + leftLayout->addWidget(m_amountSpinBox, 4, 1, 1, 1); + leftLayout->addWidget(m_biddingTypeLabel, 5, 0, 1, 1); + leftLayout->addWidget(m_biddingTypeBox, 5, 1, 1, 1); + leftLayout->addWidget(m_bidding1Label, 6, 0, 1, 1); + leftLayout->addWidget(m_bidding1SpinBox, 6, 1, 1, 1); + leftLayout->addWidget(m_bidding2Label, 7, 0, 1, 1); + leftLayout->addWidget(m_bidding2SpinBox, 7, 1, 1, 1); + leftLayout->addWidget(m_bidding3Label, 8, 0, 1, 1); + leftLayout->addWidget(m_bidding3SpinBox, 8, 1, 1, 1); + leftLayout->addWidget(m_depotWish1Label, 9, 0, 1, 1); + leftLayout->addWidget(m_depotWish1Edit, 9, 1, 1, 1); + leftLayout->addWidget(m_depotWish2Label, 10, 0, 1, 1); + leftLayout->addWidget(m_depotWish2Edit, 10, 1, 1, 1); + leftLayout->addWidget(m_mailLabel, 11, 0, 1, 1); + leftLayout->addWidget(m_mailEdit, 11, 1, 1, 1); + + leftLayout->addWidget(m_previousButton, 12, 0, 1, 1); + leftLayout->addWidget(m_nextButton, 12, 1, 1, 1); + + /// right layout + QVBoxLayout* rightLayout = new QVBoxLayout; + QHBoxLayout* onlineAccountControlLayout = new QHBoxLayout; + onlineAccountControlLayout->addWidget(m_createOnlineAccountButton); + onlineAccountControlLayout->addWidget(m_sendInviteMailButton); + rightLayout->addLayout(onlineAccountControlLayout); + QGridLayout* rightGridLayout = new QGridLayout(); + rightGridLayout->addWidget(m_onlineIdLabel, 0, 0, 1, 1); + rightGridLayout->addWidget(m_onlineIdDisplay, 0, 1, 1, 1); + rightGridLayout->addWidget(m_accessCodeLabel, 1, 0, 1, 1); + rightGridLayout->addWidget(m_accessCodeDisplay, 1, 1, 1, 1); + rightGridLayout->addWidget(m_qrCodeDisplay, 2, 0, 6, 2); + rightGridLayout->addWidget(m_accessUrlDisplay, 9, 0, 1, 2); + rightLayout->addLayout(rightGridLayout); + + QHBoxLayout* outerLayout = new QHBoxLayout; + outerLayout->addLayout(leftLayout); + outerLayout->addLayout(rightLayout); + setLayout(outerLayout); } void ItemDetailMapper::setModelMappings(QTableView* tableView) { @@ -138,6 +178,9 @@ void ItemDetailMapper::setModelMappings(QTableView* tableView) { m_mapper->addMapping(m_depotWish2Edit, 10); m_mapper->addMapping(m_mailEdit, 11); + m_mapper->addMapping(m_onlineIdDisplay, 12); + m_mapper->addMapping(m_accessCodeDisplay, 13); + m_mapper->setCurrentIndex(m_selectionModel->currentIndex().row()); connect(m_model, &QAbstractItemModel::rowsInserted, this, &ItemDetailMapper::rowsInserted); @@ -152,16 +195,6 @@ bool ItemDetailMapper::submit() { return m_mapper->submit(); } void ItemDetailMapper::revert() { m_mapper->revert(); } -void ItemDetailMapper::onCurrentIndexChanged(const QModelIndex& current, - const QModelIndex& /*previous*/) { - if (!isEnabled()) { - setEnabled(true); - } - m_mapper->setCurrentModelIndex(current); - updateButtons(current.row()); - emitContentChanged(current); -} - void ItemDetailMapper::rowsInserted(const QModelIndex& parent, int start, int end) { updateButtons(m_mapper->currentIndex()); } @@ -209,3 +242,26 @@ void ItemDetailMapper::emitContentChanged(const QModelIndex& currentIndex) { } emit contentChanged(toStringText); } + +void ItemDetailMapper::onCurrentIndexChanged(const QModelIndex& current, + const QModelIndex& /*previous*/) { + if (!isEnabled()) { + setEnabled(true); + } + m_mapper->setCurrentModelIndex(current); + updateButtons(current.row()); + emitContentChanged(current); +} + +void ItemDetailMapper::updateQRCode(const QString text) { + QImage unscaledImage; + if (text.isEmpty()) { + unscaledImage = QImage("://no-picture-taking.png"); + } else { + unscaledImage = m_generator.generateQr(text); + } + QImage image = unscaledImage.scaled(250, 250); + + m_qrCodeDisplay->setPixmap(QPixmap::fromImage(image)); + m_qrCodeDisplay->setToolTip(text); +} diff --git a/UIs/BeetRoundWidgets/views/itemdetailmapper.h b/UIs/BeetRoundWidgets/views/itemdetailmapper.h index 0c9f487..5443690 100644 --- a/UIs/BeetRoundWidgets/views/itemdetailmapper.h +++ b/UIs/BeetRoundWidgets/views/itemdetailmapper.h @@ -15,6 +15,8 @@ class QItemSelectionModel; class QStringListModel; class QTableView; +#include "QrCodeGenerator.h" + class ItemDetailMapper : public QWidget { Q_OBJECT public: @@ -29,13 +31,14 @@ class ItemDetailMapper : public QWidget { void contentChanged(const QString text); private slots: - void onCurrentIndexChanged(const QModelIndex& current, const QModelIndex& previous); void rowsInserted(const QModelIndex& parent, int start, int end); void rowsRemoved(const QModelIndex& parent, int start, int end); void toPrevious(); void toNext(); void updateButtons(int row); void emitContentChanged(const QModelIndex& currentIndex); + void onCurrentIndexChanged(const QModelIndex& current, const QModelIndex& previous); + void updateQRCode(const QString text = ""); private: /// *** members *** @@ -46,7 +49,8 @@ class ItemDetailMapper : public QWidget { std::unique_ptr m_mapper; - /// GUI elements + /// *** GUI elements *** + /// left layout QLabel* m_numberLabel; QSpinBox* m_numberBox; @@ -82,7 +86,21 @@ class ItemDetailMapper : public QWidget { QLabel* m_mailLabel; QLineEdit* m_mailEdit; - /// Model mapper stuff + /// right layout + QPushButton* m_createOnlineAccountButton = nullptr; + QPushButton* m_sendInviteMailButton = nullptr; + + QLabel* m_onlineIdLabel; + QLineEdit* m_onlineIdDisplay = nullptr; + QLabel* m_accessCodeLabel; + QLineEdit* m_accessCodeDisplay = nullptr; + + QLabel* m_qrCodeDisplay = nullptr; + QrCodeGenerator m_generator; + + QLineEdit* m_accessUrlDisplay = nullptr; + + /// *** Model mapper stuff *** QPushButton* m_nextButton; QPushButton* m_previousButton; }; From faf01d6e15ac3d41876c1bc3a0f56d67392e50e3 Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Wed, 18 Feb 2026 11:24:40 +0100 Subject: [PATCH 3/4] Online account can now be created from the EditItemDialog. The response isn't processed properly yet. --- .../dialogs/edititemdialog.cpp | 4 + UIs/BeetRoundWidgets/dialogs/edititemdialog.h | 2 + UIs/BeetRoundWidgets/mainwindow.cpp | 10 +- UIs/BeetRoundWidgets/mainwindow.h | 2 + .../views/itemdetailmapper.cpp | 46 ++++++ UIs/BeetRoundWidgets/views/itemdetailmapper.h | 7 + libs/BeetRoundCore/genericcore.cpp | 11 ++ libs/BeetRoundCore/genericcore.h | 5 + libs/BeetRoundCore/model/metadata.h | 1 + libs/BeetRoundCore/network/apiroutes.h | 2 + .../network/servercommunicator.cpp | 131 ++++++++++-------- .../network/servercommunicator.h | 6 +- 12 files changed, 163 insertions(+), 64 deletions(-) diff --git a/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp b/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp index 488919b..1565f5f 100644 --- a/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp +++ b/UIs/BeetRoundWidgets/dialogs/edititemdialog.cpp @@ -26,6 +26,10 @@ void EditItemDialog::createContent() { innerLayout->addWidget(m_detailMapper); m_outerLayout->insertWidget(0, m_contentContainer); + + /// online user stuff + connect(m_detailMapper, &ItemDetailMapper::createOnlineAccountTriggered, this, + &EditItemDialog::createOnlineAccountTriggered); } void EditItemDialog::accept() { diff --git a/UIs/BeetRoundWidgets/dialogs/edititemdialog.h b/UIs/BeetRoundWidgets/dialogs/edititemdialog.h index 67bf01e..ad28bfb 100644 --- a/UIs/BeetRoundWidgets/dialogs/edititemdialog.h +++ b/UIs/BeetRoundWidgets/dialogs/edititemdialog.h @@ -19,6 +19,8 @@ class EditItemDialog : public AbstractDialog { /// AbstractDialog interface void createContent() override; + signals: + void createOnlineAccountTriggered(const QString& mailAddress); public slots: void accept() override; void reject() override; diff --git a/UIs/BeetRoundWidgets/mainwindow.cpp b/UIs/BeetRoundWidgets/mainwindow.cpp index a042a03..ba3c9cb 100644 --- a/UIs/BeetRoundWidgets/mainwindow.cpp +++ b/UIs/BeetRoundWidgets/mainwindow.cpp @@ -16,7 +16,6 @@ #include "genericcore.h" #include "model/generalsortfiltermodel.h" #include "model/metadata.h" -#include "model/modelsummary.h" #include "model/tablemodel.h" #include "widgets/biddingroundcontrol.h" #include "widgets/comboboxdelegate.h" @@ -75,6 +74,10 @@ MainWindow::MainWindow(QWidget* parent) onCurrentChanged(QModelIndex(), QModelIndex()); setupEventTab(); + + // #ifndef QT_DEBUG + initServerConnection(); + // #endif } MainWindow::~MainWindow() { delete ui; } @@ -563,3 +566,8 @@ void MainWindow::setupEventTab() { ui->tabWidget->insertTab(0, containerWidget, "Event (&1)"); } + +void MainWindow::initServerConnection() { + connect(m_editItemDialog.get(), &EditItemDialog::createOnlineAccountTriggered, m_core.get(), + &GenericCore::onCreateOnlineAccountTriggered); +} diff --git a/UIs/BeetRoundWidgets/mainwindow.h b/UIs/BeetRoundWidgets/mainwindow.h index 2d081a7..f89c15f 100644 --- a/UIs/BeetRoundWidgets/mainwindow.h +++ b/UIs/BeetRoundWidgets/mainwindow.h @@ -120,5 +120,7 @@ class MainWindow : public QMainWindow { void createGuiDialogs(); void setupEventTab(); + + void initServerConnection(); }; #endif // MAINWINDOW_H diff --git a/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp b/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp index 11a7e95..6f7f3f1 100644 --- a/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp +++ b/UIs/BeetRoundWidgets/views/itemdetailmapper.cpp @@ -156,6 +156,15 @@ ItemDetailMapper::ItemDetailMapper(QWidget* parent) outerLayout->addLayout(leftLayout); outerLayout->addLayout(rightLayout); setLayout(outerLayout); + + /// online user account + connect(m_mailEdit, &QLineEdit::textChanged, this, &ItemDetailMapper::onMailEditChanged); + connect(m_onlineIdDisplay, &QLineEdit::textChanged, this, &ItemDetailMapper::onOnlineIDChanged); + connect(m_accessCodeDisplay, &QLineEdit::textChanged, this, + &ItemDetailMapper::onAccessCodeChanged); + + connect(m_createOnlineAccountButton, &QAbstractButton::clicked, this, + &ItemDetailMapper::onCreateOnlineAccountTriggered); } void ItemDetailMapper::setModelMappings(QTableView* tableView) { @@ -265,3 +274,40 @@ void ItemDetailMapper::updateQRCode(const QString text) { m_qrCodeDisplay->setPixmap(QPixmap::fromImage(image)); m_qrCodeDisplay->setToolTip(text); } + +void ItemDetailMapper::onMailEditChanged(const QString& text) { + if (text.isEmpty()) { + m_createOnlineAccountButton->setEnabled(false); + m_sendInviteMailButton->setEnabled(false); + } else { + onOnlineIDChanged(m_onlineIdDisplay->text()); + onAccessCodeChanged(m_accessCodeDisplay->text()); + } +} + +void ItemDetailMapper::onOnlineIDChanged(const QString& text) { + if (text.isEmpty()) { + m_createOnlineAccountButton->setEnabled(true); + m_sendInviteMailButton->setEnabled(false); + } else { + m_createOnlineAccountButton->setEnabled(false); + m_sendInviteMailButton->setEnabled(true); + } +} + +void ItemDetailMapper::onAccessCodeChanged(const QString& text) { + if (text.isEmpty()) { + m_sendInviteMailButton->setEnabled(false); + m_accessUrlDisplay->setText(""); + updateQRCode(""); + } else { + m_sendInviteMailButton->setEnabled(true); + const QString accessUrl = "http://127.0.0.1:4000/api/users/" + text; + m_accessUrlDisplay->setText(accessUrl); + updateQRCode(accessUrl); + } +} + +void ItemDetailMapper::onCreateOnlineAccountTriggered() { + emit createOnlineAccountTriggered(m_mailEdit->text()); +} diff --git a/UIs/BeetRoundWidgets/views/itemdetailmapper.h b/UIs/BeetRoundWidgets/views/itemdetailmapper.h index 5443690..9aa802e 100644 --- a/UIs/BeetRoundWidgets/views/itemdetailmapper.h +++ b/UIs/BeetRoundWidgets/views/itemdetailmapper.h @@ -30,6 +30,8 @@ class ItemDetailMapper : public QWidget { signals: void contentChanged(const QString text); + void createOnlineAccountTriggered(const QString& mailAddress); + private slots: void rowsInserted(const QModelIndex& parent, int start, int end); void rowsRemoved(const QModelIndex& parent, int start, int end); @@ -38,7 +40,12 @@ class ItemDetailMapper : public QWidget { void updateButtons(int row); void emitContentChanged(const QModelIndex& currentIndex); void onCurrentIndexChanged(const QModelIndex& current, const QModelIndex& previous); + void updateQRCode(const QString text = ""); + void onMailEditChanged(const QString& text); + void onOnlineIDChanged(const QString& text); + void onAccessCodeChanged(const QString& text); + void onCreateOnlineAccountTriggered(); private: /// *** members *** diff --git a/libs/BeetRoundCore/genericcore.cpp b/libs/BeetRoundCore/genericcore.cpp index 015705a..e4ef5b1 100644 --- a/libs/BeetRoundCore/genericcore.cpp +++ b/libs/BeetRoundCore/genericcore.cpp @@ -160,6 +160,17 @@ void GenericCore::onBiddingsChanged(int round, QList biddings) { // NEXT merge biddings into model } +void GenericCore::onCreateOnlineAccountTriggered(const QString& mailAddress) { + qInfo() << "Creating online account for:" << mailAddress; + // QJsonDocument onlineCredentialsDoc = m_mainModel->getOnlineCredentialsAsJsonDoc(mailAddress); + // emit createOnlineUser(onlineCredentialsDoc.toJson()); + emit sendPostRequest(RegisterUser, mailAddress); +} + +// void GenericCore::onOnlineUserCreatedReceived(const QJsonDocument& jsonDoc) {} + +// void GenericCore::onOnlineUserExistedReceived(const QJsonDocument jsonDoc) {} + void GenericCore::setupModels() { m_mainModel = make_shared(m_modelUndoStack); m_sortFilterModel = make_shared(m_mainModel); diff --git a/libs/BeetRoundCore/genericcore.h b/libs/BeetRoundCore/genericcore.h index 8751648..b87be80 100644 --- a/libs/BeetRoundCore/genericcore.h +++ b/libs/BeetRoundCore/genericcore.h @@ -49,12 +49,17 @@ class GenericCore : public QObject { public slots: void onBiddingsChanged(int round, QList biddings); + void onCreateOnlineAccountTriggered(const QString& mailAddress); + // void onOnlineUserCreatedReceived(const QJsonDocument& jsonDoc); + // void onOnlineUserExistedReceived(const QJsonDocument jsonDoc); + signals: void displayStatusMessage(QString message); /// *** server communication *** /// request signals void sendGetRequest(GetRequestTypes type, QVariant data = QVariant()); + void sendPostRequest(PostRequestTypes type, QVariant data = QVariant()); /// response signals void currentBiddingRoundChanged(int round, bool isRunning); diff --git a/libs/BeetRoundCore/model/metadata.h b/libs/BeetRoundCore/model/metadata.h index dbbe9c0..83ffdb9 100644 --- a/libs/BeetRoundCore/model/metadata.h +++ b/libs/BeetRoundCore/model/metadata.h @@ -91,6 +91,7 @@ enum GetRequestTypes { GetBiddingsOfSpecificRound, GetBiddingsOfHighestRound }; +enum PostRequestTypes { RegisterUser }; /// functions static UserRoles GET_ROLE_FOR_COLUMN(const int column) { diff --git a/libs/BeetRoundCore/network/apiroutes.h b/libs/BeetRoundCore/network/apiroutes.h index 5422772..a89c9f5 100644 --- a/libs/BeetRoundCore/network/apiroutes.h +++ b/libs/BeetRoundCore/network/apiroutes.h @@ -9,6 +9,8 @@ static const QString apiPrefix = "/api/"; static const QString ROUTE_ITEMS = apiPrefix + "items"; +static const QString ROUTE_REGISTER_USER = apiPrefix + "users"; + static const QString ROUTE_BIDDINGROUNDS = apiPrefix + "bidding_rounds"; static const QString ROUTE_CURRENT_BIDDINGROUND = ROUTE_BIDDINGROUNDS + "/get_current"; static const QString ROUTE_START_BIDDINGROUND = ROUTE_BIDDINGROUNDS + "/start_new"; diff --git a/libs/BeetRoundCore/network/servercommunicator.cpp b/libs/BeetRoundCore/network/servercommunicator.cpp index 0c42fb6..f3db0f5 100644 --- a/libs/BeetRoundCore/network/servercommunicator.cpp +++ b/libs/BeetRoundCore/network/servercommunicator.cpp @@ -20,6 +20,8 @@ ServerCommunicator::ServerCommunicator(GenericCore* core) connect(m_core, &GenericCore::sendGetRequest, this, &ServerCommunicator::onSendGetRequestTriggered); + connect(m_core, &GenericCore::sendPostRequest, this, + &ServerCommunicator::onSendPostRequestTriggered); connect(this, &ServerCommunicator::biddingsChanged, m_core, &GenericCore::onBiddingsChanged); } @@ -44,66 +46,6 @@ void ServerCommunicator::setUrl(const QUrl& url) { emit urlChanged(); } -void ServerCommunicator::fetchItems() { - /// Set up a GET request - m_restManager->get(m_serviceApi->createRequest(ROUTE_ITEMS), this, [this](QRestReply& reply) { - if (reply.isSuccess()) { - qInfo() << "Fetching items successful."; - const QJsonDocument doc = reply.readJson().value(); - emit itemsFetched(doc.toJson()); - - } else { - if (reply.hasError()) { - const QString errorString = reply.errorString(); - qCritical() << "ERROR:" << errorString; - emit itemsFetchFailure(errorString); - } else { - int statusCode = reply.httpStatus(); - qCritical() << "ERROR:" << statusCode; - emit itemsFetchFailure(QString::number(statusCode)); - emit itemsFetchFailure(QString("HTTP status code: %1").arg(statusCode)); - } - } - }); -} - -void ServerCommunicator::postItems(const QByteArray& jsonData) { - QNetworkReply* reply = m_restManager->post(m_serviceApi->createRequest(ROUTE_ITEMS), jsonData); - - QObject::connect(reply, &QNetworkReply::finished, [=]() { - if (reply->error() == QNetworkReply::NoError) { - QByteArray responseData = reply->readAll(); - const QString message = QString("POST successful! Response: %1").arg(responseData); - qInfo() << message; - emit postRequestSuccessful(responseData); - } else { - const QString message = QString("Error: %1").arg(reply->errorString()); - qDebug() << message; - emit postRequestFailure(message); - } - reply->deleteLater(); - }); -} - -void ServerCommunicator::deleteItem(const QString& id) { - const QString deleteRoute = QString("%1/%2").arg(ROUTE_ITEMS, id); - QNetworkReply* reply = m_restManager->deleteResource(m_serviceApi->createRequest(deleteRoute)); - - QObject::connect(reply, &QNetworkReply::finished, [=]() { - if (reply->error() == QNetworkReply::NoError) { - QByteArray responseData = reply->readAll(); - const QString message = QString("DELETE successful! Response: %1").arg(responseData); - qInfo() << message; - emit deleteRequestSuccessful(responseData); - } else { - const QString message = QString("Error: %1").arg(reply->errorString()); - qDebug() << message; - emit deleteRequestFailure(message); - } - reply->deleteLater(); - }); -} - void ServerCommunicator::setServerConfiguration(const QString url, const QString email, const QString password) { @@ -191,6 +133,75 @@ void ServerCommunicator::onGetReplyFailure(const GetRequestTypes type, const QSt m_core->displayStatusMessage(message); } +void ServerCommunicator::onSendPostRequestTriggered(const PostRequestTypes type, QVariant data) { + QString path; + switch (type) { + case RegisterUser: + path = ROUTE_REGISTER_USER; + break; + default: + qWarning() << "No route found for PostRequestType:" << type; + break; + } + + // TODO move into default case of switch statement? + if (path.isEmpty()) { + qDebug() << "Empty path -> Not sending a request."; + return; + } + + const QNetworkRequest request = m_serviceApi->createRequest(path); + + QJsonDocument doc = QJsonDocument(); + QJsonObject rootObject; + + QJsonObject itemObject; + itemObject.insert("email", data.toString()); + rootObject.insert("user", itemObject); + + doc.setObject(rootObject); + + m_restManager->post(request, doc, this, [this, type](QRestReply& reply) { + if (reply.isSuccess()) { + int statusCode = reply.httpStatus(); + qInfo() << "Request successful. Status code:" << statusCode; + const QJsonDocument doc = reply.readJson().value(); + onPostReplySuccessful(type, doc); + } else { + if (reply.hasError()) { + const QString errorString = reply.errorString(); + qWarning() << "Network error:" << errorString; + onPostReplyFailure(type, errorString); + } else { + int statusCode = reply.httpStatus(); + qWarning() << "Request not successful:" << statusCode; + qCritical() << "Content:" << reply.readJson(); + onPostReplyFailure(type, QString("HTTP status code: %1").arg(statusCode)); + } + } + }); +} + +void ServerCommunicator::onPostReplySuccessful(const PostRequestTypes type, + const QJsonDocument doc) { + switch (type) { + case RegisterUser: + qInfo() << "Register user successful:" << type; + m_core->displayStatusMessage(doc.toJson()); + break; + default: + qWarning() << "Can't match request type:" << type; + break; + } +} + +void ServerCommunicator::onPostReplyFailure(const PostRequestTypes type, + const QString errorString) { + const QString message = + QString("Request of type %1 returned: %2").arg(QString::number(type), errorString); + m_core->displayStatusMessage(message); +} + void ServerCommunicator::currentBiddingRoundChangedReply(const QJsonDocument jsonDoc) { qInfo() << "Current bidding round received."; const QJsonObject rootObject = jsonDoc["data"].toObject(); diff --git a/libs/BeetRoundCore/network/servercommunicator.h b/libs/BeetRoundCore/network/servercommunicator.h index 0f6b3df..f69275d 100644 --- a/libs/BeetRoundCore/network/servercommunicator.h +++ b/libs/BeetRoundCore/network/servercommunicator.h @@ -29,9 +29,9 @@ class ServerCommunicator : public QObject { void onGetReplySuccessful(const GetRequestTypes type, const QJsonDocument doc); void onGetReplyFailure(const GetRequestTypes type, const QString errorString); - void fetchItems(); - void postItems(const QByteArray& jsonData); - void deleteItem(const QString& id); + void onSendPostRequestTriggered(const PostRequestTypes type, QVariant data); + void onPostReplySuccessful(const PostRequestTypes type, const QJsonDocument doc); + void onPostReplyFailure(const PostRequestTypes type, const QString errorString); signals: void urlChanged(); From 7d31ac8806b0ecc31ab3868c1f6e943b206f1087 Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Thu, 19 Feb 2026 09:10:06 +0100 Subject: [PATCH 4/4] When receiving online user credentials insert them into the model. --- libs/BeetRoundCore/formats/jsonparser.cpp | 22 ++++- libs/BeetRoundCore/formats/jsonparser.h | 2 + libs/BeetRoundCore/genericcore.cpp | 17 ++-- libs/BeetRoundCore/genericcore.h | 7 +- libs/BeetRoundCore/model/tablemodel.cpp | 81 +++++++++++++------ libs/BeetRoundCore/model/tablemodel.h | 3 + .../network/servercommunicator.cpp | 30 ++++--- .../network/servercommunicator.h | 6 +- 8 files changed, 121 insertions(+), 47 deletions(-) diff --git a/libs/BeetRoundCore/formats/jsonparser.cpp b/libs/BeetRoundCore/formats/jsonparser.cpp index 3067cc6..6e477fc 100644 --- a/libs/BeetRoundCore/formats/jsonparser.cpp +++ b/libs/BeetRoundCore/formats/jsonparser.cpp @@ -70,7 +70,25 @@ QByteArray JsonParser::itemValuesListToJson(const QList& itemVa return jsonDoc.toJson(QJsonDocument::Compact); } -JsonParser::JsonParser() {} +QByteArray JsonParser::ToJsonObject(const QHash& values, + const QString& objectName) { + QJsonDocument jsonDoc; + QJsonObject rootObject; + QJsonObject itemObject; + + QHashIterator i(values); + while (i.hasNext()) { + i.next(); + const QString key = i.key(); + const QVariant value = i.value(); + itemObject.insert(key, value.toString()); + } + + rootObject.insert(objectName, itemObject); + jsonDoc.setObject(rootObject); + + return jsonDoc.toJson(QJsonDocument::Compact); +} QJsonArray JsonParser::extractItemArray(const QJsonDocument& doc, const QString& objectName) { QJsonArray itemArray; @@ -83,6 +101,8 @@ QJsonArray JsonParser::extractItemArray(const QJsonDocument& doc, const QString& return itemArray; } +JsonParser::JsonParser() {} + ModelItemValues JsonParser::jsonObjectToItemValues(const QJsonObject& itemJsonObject) { ModelItemValues values; diff --git a/libs/BeetRoundCore/formats/jsonparser.h b/libs/BeetRoundCore/formats/jsonparser.h index bb920fd..fee12ec 100644 --- a/libs/BeetRoundCore/formats/jsonparser.h +++ b/libs/BeetRoundCore/formats/jsonparser.h @@ -18,6 +18,8 @@ class JsonParser { const QString& rootValueName = ""); static QByteArray itemValuesListToJson(const QList& itemValuesList, const QString& objectName = ""); + static QByteArray ToJsonObject(const QHash& Values, + const QString& objectName = ""); private: explicit JsonParser(); diff --git a/libs/BeetRoundCore/genericcore.cpp b/libs/BeetRoundCore/genericcore.cpp index e4ef5b1..dcc83fb 100644 --- a/libs/BeetRoundCore/genericcore.cpp +++ b/libs/BeetRoundCore/genericcore.cpp @@ -162,14 +162,21 @@ void GenericCore::onBiddingsChanged(int round, QList biddings) { void GenericCore::onCreateOnlineAccountTriggered(const QString& mailAddress) { qInfo() << "Creating online account for:" << mailAddress; - // QJsonDocument onlineCredentialsDoc = m_mainModel->getOnlineCredentialsAsJsonDoc(mailAddress); - // emit createOnlineUser(onlineCredentialsDoc.toJson()); - emit sendPostRequest(RegisterUser, mailAddress); + QHash hash; + hash.insert("email", mailAddress); + const QByteArray jsonDoc = JsonParser::ToJsonObject(hash, "user"); + emit sendPostRequest(RegisterUser, jsonDoc); } -// void GenericCore::onOnlineUserCreatedReceived(const QJsonDocument& jsonDoc) {} +void GenericCore::onOnlineUserAccountReceived(const QString mailAddress, + const QString uuid, + const QString accessToken) { + m_mainModel->setOnlineCredentials(mailAddress, uuid, accessToken); -// void GenericCore::onOnlineUserExistedReceived(const QJsonDocument jsonDoc) {} + const QString message = QString("Online credentials received for: %1").arg(mailAddress); + emit displayStatusMessage(message); +} +} void GenericCore::setupModels() { m_mainModel = make_shared(m_modelUndoStack); diff --git a/libs/BeetRoundCore/genericcore.h b/libs/BeetRoundCore/genericcore.h index b87be80..c3e5609 100644 --- a/libs/BeetRoundCore/genericcore.h +++ b/libs/BeetRoundCore/genericcore.h @@ -50,8 +50,9 @@ class GenericCore : public QObject { void onBiddingsChanged(int round, QList biddings); void onCreateOnlineAccountTriggered(const QString& mailAddress); - // void onOnlineUserCreatedReceived(const QJsonDocument& jsonDoc); - // void onOnlineUserExistedReceived(const QJsonDocument jsonDoc); + void onOnlineUserAccountReceived(const QString mailAddress, + const QString uuid, + const QString accessToken); signals: void displayStatusMessage(QString message); @@ -59,7 +60,7 @@ class GenericCore : public QObject { /// *** server communication *** /// request signals void sendGetRequest(GetRequestTypes type, QVariant data = QVariant()); - void sendPostRequest(PostRequestTypes type, QVariant data = QVariant()); + void sendPostRequest(PostRequestTypes type, QByteArray data); /// response signals void currentBiddingRoundChanged(int round, bool isRunning); diff --git a/libs/BeetRoundCore/model/tablemodel.cpp b/libs/BeetRoundCore/model/tablemodel.cpp index ba7bab9..969d82a 100644 --- a/libs/BeetRoundCore/model/tablemodel.cpp +++ b/libs/BeetRoundCore/model/tablemodel.cpp @@ -231,6 +231,14 @@ bool TableModel::updateItem(const ModelItemValues& itemValues) { } } +void TableModel::setOnlineCredentials(const QString& mail, + const QString& uuid, + const QString& token) { + QModelIndex itemIndex = getIndexByRoleValue(mail, MailRole); + setItemData(itemIndex, {{OnlineIdRole, uuid}, {AccessCodeRole, token}}); +} + + bool TableModel::removeRows(int firstRow, int nRows, const QModelIndex& parentIndex) { if (parentIndex != QModelIndex()) { qWarning() << "Removing of child rows is not supported yet!"; @@ -282,29 +290,6 @@ void TableModel::insertItems(int startPosition, m_undoStack->push(insertCommand); } -void TableModel::onRowCountChanged(const QModelIndex& parent, int first, int last) { - Q_UNUSED(first); - Q_UNUSED(last); - - if (parent != QModelIndex()) { - return; - } - emit rowCountChanged(); - emit nExpectedBiddingsChanged(); - - emit nPlacedBiddingsChanged(1); - emit nPlacedBiddingsChanged(2); - emit nPlacedBiddingsChanged(3); - - emit biddingSumChanged(1); - emit biddingSumChanged(2); - emit biddingSumChanged(3); - - emit biddingAverageChanged(1); - emit biddingAverageChanged(2); - emit biddingAverageChanged(3); -} - int TableModel::nExpectedBiddings() const { int result = 0; for (auto i = m_items.begin(), end = m_items.end(); i != end; ++i) { @@ -352,6 +337,29 @@ qreal TableModel::biddingAverage3() const { return averageBidding; } +void TableModel::onRowCountChanged(const QModelIndex& parent, int first, int last) { + Q_UNUSED(first); + Q_UNUSED(last); + + if (parent != QModelIndex()) { + return; + } + emit rowCountChanged(); + emit nExpectedBiddingsChanged(); + + emit nPlacedBiddingsChanged(1); + emit nPlacedBiddingsChanged(2); + emit nPlacedBiddingsChanged(3); + + emit biddingSumChanged(1); + emit biddingSumChanged(2); + emit biddingSumChanged(3); + + emit biddingAverageChanged(1); + emit biddingAverageChanged(2); + emit biddingAverageChanged(3); +} + void TableModel::execInsertItems(const int firstRow, const QList valueList) { const int nRows = valueList.size(); qDebug() << "Inserting" << nRows << "items..."; @@ -387,7 +395,6 @@ void TableModel::execEditItemData(const int row, const QMap& chan roles.insert(0, Qt::DisplayRole); emit dataChanged(firstIndex, lastIndex, roles.toVector()); - // NEXT check which roles are changed & trigger only changed properties if (roles.contains(BiddingTypeRole) || roles.contains(ShareAmountRole) || roles.contains(ShareTypeRole)) { emit nExpectedBiddingsChanged(); @@ -576,3 +583,29 @@ qreal TableModel::totalSharesWithBiddings(const UserRoles biddingRole) const { qInfo() << "Biddings exist for " << result << "shares!"; return result; } + +QModelIndex TableModel::getIndexByRoleValue(const QString& valueString, const int role) const { + const QString text = + QString("Searching list item with value '%1' for role '%2'").arg(valueString, role); + qInfo() << text; + int itemRow = -1; + + for (auto i = m_items.begin(), end = m_items.end(); i != end; ++i) { + const QString mailValue = (*i)->data(role).toString(); + qDebug() << "found value:" << mailValue; + if (valueString == mailValue) { + itemRow = i - m_items.constBegin(); + qInfo() << "Found item at row:" << itemRow; + break; + } else { + qDebug() << "Not the right item. Continuing search..."; + continue; + } + } + if (itemRow < 0 || itemRow >= m_items.length()) { + qWarning() << "Couldn't find item with mail address:" << valueString << "- Returning..."; + return QModelIndex(); + } + const QModelIndex itemIndex = index(itemRow, 0); + return itemIndex; +} diff --git a/libs/BeetRoundCore/model/tablemodel.h b/libs/BeetRoundCore/model/tablemodel.h index 9d7d03d..2303b4b 100644 --- a/libs/BeetRoundCore/model/tablemodel.h +++ b/libs/BeetRoundCore/model/tablemodel.h @@ -44,6 +44,7 @@ class TableModel : public QAbstractTableModel { QString updateItemsFromJson(const QByteArray& jsonData); bool updateItem(const ModelItemValues& itemValues); + void setOnlineCredentials(const QString& mail, const QString& uuid, const QString& token); public slots: // bool insertRows(int position, int rows, const QModelIndex& parentIndex = QModelIndex()) // override; @@ -105,6 +106,8 @@ class TableModel : public QAbstractTableModel { int biddingSum(const UserRoles biddingRole) const; qreal averageBiddingAmount(const UserRoles biddingRole) const; qreal totalSharesWithBiddings(const UserRoles biddingRole) const; + + QModelIndex getIndexByRoleValue(const QString& valueString, const int role) const; }; #endif // TABLEMODEL_H diff --git a/libs/BeetRoundCore/network/servercommunicator.cpp b/libs/BeetRoundCore/network/servercommunicator.cpp index f3db0f5..cc332fe 100644 --- a/libs/BeetRoundCore/network/servercommunicator.cpp +++ b/libs/BeetRoundCore/network/servercommunicator.cpp @@ -23,6 +23,8 @@ ServerCommunicator::ServerCommunicator(GenericCore* core) connect(m_core, &GenericCore::sendPostRequest, this, &ServerCommunicator::onSendPostRequestTriggered); connect(this, &ServerCommunicator::biddingsChanged, m_core, &GenericCore::onBiddingsChanged); + connect(this, &ServerCommunicator::onlineUserAccountReceived, m_core, + &GenericCore::onOnlineUserAccountReceived); } bool ServerCommunicator::sslSupported() const { @@ -133,7 +135,8 @@ void ServerCommunicator::onGetReplyFailure(const GetRequestTypes type, const QSt m_core->displayStatusMessage(message); } -void ServerCommunicator::onSendPostRequestTriggered(const PostRequestTypes type, QVariant data) { +void ServerCommunicator::onSendPostRequestTriggered(const PostRequestTypes type, + const QByteArray data) { QString path; switch (type) { case RegisterUser: @@ -152,16 +155,7 @@ void ServerCommunicator::onSendPostRequestTriggered(const PostRequestTypes type, const QNetworkRequest request = m_serviceApi->createRequest(path); - QJsonDocument doc = QJsonDocument(); - QJsonObject rootObject; - - QJsonObject itemObject; - itemObject.insert("email", data.toString()); - rootObject.insert("user", itemObject); - - doc.setObject(rootObject); - - m_restManager->post(request, doc, this, [this, type](QRestReply& reply) { + m_restManager->post(request, data, this, [this, type](QRestReply& reply) { if (reply.isSuccess()) { int statusCode = reply.httpStatus(); qInfo() << "Request successful. Status code:" << statusCode; @@ -187,7 +181,7 @@ void ServerCommunicator::onPostReplySuccessful(const PostRequestTypes type, switch (type) { case RegisterUser: qInfo() << "Register user successful:" << type; - m_core->displayStatusMessage(doc.toJson()); + onlineUserAccountReply(doc); break; default: qWarning() << "Can't match request type:" << type; @@ -225,6 +219,16 @@ void ServerCommunicator::currentBiddingsReply(const QJsonDocument jsonDoc) { .depotWishOne = "one", .depotWishTwo = "two"}; const QList biddings{dummyBidding}; - emit biddingsChanged(roundNumber, biddings); } + +void ServerCommunicator::onlineUserAccountReply(const QJsonDocument jsonDoc) { + qInfo() << "Online user account received."; + // TODO move data extraction of jsonDoc into JsonParser + const QJsonObject rootObject = jsonDoc["data"].toObject(); + const QString emailAddress = rootObject["email"].toString(); + const QString uuid = rootObject["id"].toString(); + const QString token = rootObject["token"].toString(); + + emit onlineUserAccountReceived(emailAddress, uuid, token); +} diff --git a/libs/BeetRoundCore/network/servercommunicator.h b/libs/BeetRoundCore/network/servercommunicator.h index f69275d..1e0bbf6 100644 --- a/libs/BeetRoundCore/network/servercommunicator.h +++ b/libs/BeetRoundCore/network/servercommunicator.h @@ -29,7 +29,7 @@ class ServerCommunicator : public QObject { void onGetReplySuccessful(const GetRequestTypes type, const QJsonDocument doc); void onGetReplyFailure(const GetRequestTypes type, const QString errorString); - void onSendPostRequestTriggered(const PostRequestTypes type, QVariant data); + void onSendPostRequestTriggered(const PostRequestTypes type, const QByteArray data); void onPostReplySuccessful(const PostRequestTypes type, const QJsonDocument doc); void onPostReplyFailure(const PostRequestTypes type, const QString errorString); @@ -45,6 +45,9 @@ class ServerCommunicator : public QObject { void currentBiddingRoundChanged(int round, bool isRunning); void biddingsChanged(int round, QList biddings); + void onlineUserAccountReceived(const QString mailAddress, + const QString uuid, + const QString accessToken); private: GenericCore* m_core = nullptr; @@ -60,6 +63,7 @@ class ServerCommunicator : public QObject { /// reply parser void currentBiddingRoundChangedReply(const QJsonDocument jsonDoc); void currentBiddingsReply(const QJsonDocument jsonDoc); + void onlineUserAccountReply(const QJsonDocument jsonDoc); }; #endif // SERVERCOMMUNICATOR_H