diff --git a/genericcore.cpp b/genericcore.cpp index e757136..707037f 100644 --- a/genericcore.cpp +++ b/genericcore.cpp @@ -142,16 +142,15 @@ bool GenericCore::isSyncServerSetup() const { } } -void GenericCore::onSendItemTriggered(const int row) { - // NEXT gather item values from model to send to server - m_serverCommunicator->postItems(); +void GenericCore::onSendItemTriggered(const QByteArray& jsonData) { + m_serverCommunicator->postItems(jsonData); } -void GenericCore::onItemsFetched(const QByteArray jsonDoc) { +void GenericCore::onItemsFetched(const QByteArray jsonData) { emit displayStatusMessage("New items fetched."); // TODO ? check compability of JSON structure beforehand? // TODO check if item already exists? - m_mainModel->appendItems(jsonDoc); + m_mainModel->appendItems(jsonData); } void GenericCore::onItemsFetchFailure(const QString errorString) { diff --git a/genericcore.h b/genericcore.h index 8e4e8b3..9fc1e2a 100644 --- a/genericcore.h +++ b/genericcore.h @@ -36,8 +36,8 @@ class GenericCore : public QObject { bool isSyncServerSetup() const; public slots: - void onSendItemTriggered(const int row); - void onItemsFetched(const QByteArray jsonDoc); + void onSendItemTriggered(const QByteArray& jsonData); + void onItemsFetched(const QByteArray jsonData); void onItemsFetchFailure(const QString errorString); void onPostRequestSuccessful(const QString message); void onPostRequestFailure(const QString errorString); @@ -45,7 +45,7 @@ class GenericCore : public QObject { signals: void displayStatusMessage(QString message); void fetchItemsFromServer(); - void sendItemToServer(int row); + void sendItemToServer(const QByteArray& jsonData); private: QUndoStack* m_modelUndoStack; diff --git a/model/generalsortfiltermodel.cpp b/model/generalsortfiltermodel.cpp index 0b1133e..75784e5 100644 --- a/model/generalsortfiltermodel.cpp +++ b/model/generalsortfiltermodel.cpp @@ -23,6 +23,11 @@ QItemSelection GeneralSortFilterModel::findItems(const QString& text) const { return result; } +QByteArray GeneralSortFilterModel::jsonDataForServer(const QModelIndex& proxyIndex) { + const QModelIndex sourceIndex = mapToSource(proxyIndex); + return m_tableModel->jsonDataForServer(sourceIndex); +} + void GeneralSortFilterModel::appendItems(const QByteArray& jsonDoc) { m_tableModel->appendItems(jsonDoc); } diff --git a/model/generalsortfiltermodel.h b/model/generalsortfiltermodel.h index 3fa4a8b..9afdabc 100644 --- a/model/generalsortfiltermodel.h +++ b/model/generalsortfiltermodel.h @@ -18,6 +18,8 @@ class GeneralSortFilterModel : public QSortFilterProxyModel { */ QItemSelection findItems(const QString& text) const; + QByteArray jsonDataForServer(const QModelIndex& proxyIndex); + public slots: void appendItems(const QByteArray& jsonDoc); bool removeRows(int firstRow, int nRows, const QModelIndex& parentIndex = QModelIndex()) override; diff --git a/model/metadata.h b/model/metadata.h index 20a5e06..ce42c60 100644 --- a/model/metadata.h +++ b/model/metadata.h @@ -15,9 +15,11 @@ enum UserRoles { InfoRole, AmountRole, FactorRole, - /// helper roles + /// Non user facing + IdRole, + /// read only roles ToStringRole, - IdRole + ToJsonRole }; static UserRoles DEFAULT_ROLE = NameRole; diff --git a/model/tablemodel.cpp b/model/tablemodel.cpp index f11e3b3..6d97e03 100644 --- a/model/tablemodel.cpp +++ b/model/tablemodel.cpp @@ -86,6 +86,8 @@ QVariant TableModel::data(const QModelIndex& index, int role) const { return m_items.at(row)->data(role); case ToStringRole: return m_items.at(row)->toString(); + case ToJsonRole: + return m_items.at(row)->toJsonObject(); } return QVariant(); @@ -169,6 +171,15 @@ QList TableModel::getItemsAsStringLists() const { return result; } +// TODO use item selection as parameter to wrap multiple items into JSON data structure +QByteArray TableModel::jsonDataForServer(const QModelIndex& currentIndex) const { + const QJsonObject itemObject = data(currentIndex, ToJsonRole).toJsonObject(); + QJsonObject rootObject; + rootObject.insert("item", itemObject); + const QJsonDocument jsonDoc(rootObject); + return jsonDoc.toJson(QJsonDocument::Compact); +} + bool TableModel::removeRows(int firstRow, int nRows, const QModelIndex& parentIndex) { if (parentIndex != QModelIndex()) { qWarning() << "Removing of child rows is not supported yet!"; diff --git a/model/tablemodel.h b/model/tablemodel.h index 4bd2dcd..4017d55 100644 --- a/model/tablemodel.h +++ b/model/tablemodel.h @@ -38,6 +38,8 @@ class TableModel : public QAbstractTableModel { QJsonDocument getAllItemsAsJsonDoc() const; QList getItemsAsStringLists() const; + QByteArray jsonDataForServer(const QModelIndex& currentIndex) const; + public slots: // bool insertRows(int position, int rows, const QModelIndex& parentIndex = QModelIndex()) // override; diff --git a/network/servercommunicator.cpp b/network/servercommunicator.cpp index c4fce47..feb41ea 100644 --- a/network/servercommunicator.cpp +++ b/network/servercommunicator.cpp @@ -60,20 +60,7 @@ void ServerCommunicator::fetchItems() { }); } -void ServerCommunicator::postItems() { - QJsonObject itemObject; - itemObject["name"] = "Post test 1"; - itemObject["description"] = "Post description 1"; - itemObject["info"] = "Post info 1"; - itemObject["amount"] = 1; - itemObject["factor"] = 5.3; - - QJsonObject rootObject; - rootObject.insert("item", itemObject); - - QJsonDocument jsonDoc(rootObject); - QByteArray jsonData = jsonDoc.toJson(); - +void ServerCommunicator::postItems(const QByteArray& jsonData) { QNetworkReply* reply = m_restManager->post(m_serviceApi->createRequest(ROUTE_ITEMS), jsonData); QObject::connect(reply, &QNetworkReply::finished, [=]() { diff --git a/network/servercommunicator.h b/network/servercommunicator.h index 73ac5f4..257a4c8 100644 --- a/network/servercommunicator.h +++ b/network/servercommunicator.h @@ -18,7 +18,8 @@ class ServerCommunicator : public QObject { public slots: void fetchItems(); - void postItems(); /// NEXT add item(s) as argument; + void postItems(const QByteArray& jsonData); + // NEXT void deleteItems(QList idList) signals: void urlChanged();