summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMinijackson <minijackson@riseup.net>2018-02-26 14:38:03 +0100
committerMinijackson <minijackson@riseup.net>2018-02-26 14:42:42 +0100
commitfc7aafe08f922fb15d077304b130071bb9e69392 (patch)
treea7a9e7b869190600ab436dbbf4063a7493239f80
parent80debf90c987746d8a45560c2b9e1f4c61f69fd3 (diff)
downloadkube-fc7aafe08f922fb15d077304b130071bb9e69392.tar.gz
kube-fc7aafe08f922fb15d077304b130071bb9e69392.zip
Finishing test log view + proper message display in log view
-rw-r--r--framework/src/domain/maillistmodel.cpp33
-rw-r--r--framework/src/domain/maillistmodel.h4
-rw-r--r--tests/teststore.cpp15
-rw-r--r--views/log/main.qml18
-rw-r--r--views/log/main.qml.bak139
-rw-r--r--views/log/qml/View.qml72
6 files changed, 257 insertions, 24 deletions
diff --git a/framework/src/domain/maillistmodel.cpp b/framework/src/domain/maillistmodel.cpp
index e2f52d13..64621d2c 100644
--- a/framework/src/domain/maillistmodel.cpp
+++ b/framework/src/domain/maillistmodel.cpp
@@ -400,3 +400,36 @@ bool MailListModel::showInbox() const
400{ 400{
401 return false; 401 return false;
402} 402}
403
404void MailListModel::setEntityId(const QString &id)
405{
406 qDebug() << "Fixing mail ID: " << id << " and running mail query";
407 using namespace Sink::ApplicationDomain;
408 Sink::Query query;
409 query.setFlags(Sink::Query::LiveQuery);
410 query.filter(id.toUtf8());
411 query.request<Mail::Subject>();
412 query.request<Mail::Sender>();
413 query.request<Mail::To>();
414 query.request<Mail::Cc>();
415 query.request<Mail::Bcc>();
416 query.request<Mail::Date>();
417 query.request<Mail::Unread>();
418 query.request<Mail::Important>();
419 query.request<Mail::Draft>();
420 query.request<Mail::Folder>();
421 query.request<Mail::Sent>();
422 query.request<Mail::Trash>();
423 query.request<Mail::MimeMessage>();
424 query.request<Mail::FullPayloadAvailable>();
425 mFetchMails = true;
426 mFetchedMails.clear();
427 // Latest mail at the top
428 sort(0, Qt::DescendingOrder);
429 runQuery(query);
430}
431
432QString MailListModel::entityId() const
433{
434 return {};
435}
diff --git a/framework/src/domain/maillistmodel.h b/framework/src/domain/maillistmodel.h
index f83656b9..a6965915 100644
--- a/framework/src/domain/maillistmodel.h
+++ b/framework/src/domain/maillistmodel.h
@@ -33,6 +33,7 @@ class MailListModel : public QSortFilterProxyModel
33 Q_PROPERTY (QVariant mail READ mail WRITE setMail) 33 Q_PROPERTY (QVariant mail READ mail WRITE setMail)
34 Q_PROPERTY (bool showDrafts READ showDrafts WRITE setShowDrafts) 34 Q_PROPERTY (bool showDrafts READ showDrafts WRITE setShowDrafts)
35 Q_PROPERTY (bool showInbox READ showInbox WRITE setShowInbox) 35 Q_PROPERTY (bool showInbox READ showInbox WRITE setShowInbox)
36 Q_PROPERTY (QString entityId READ entityId WRITE setEntityId)
36 37
37 Q_PROPERTY (QString filter READ filter WRITE setFilter) 38 Q_PROPERTY (QString filter READ filter WRITE setFilter)
38 39
@@ -93,6 +94,9 @@ public:
93 void setShowInbox(bool); 94 void setShowInbox(bool);
94 bool showInbox() const; 95 bool showInbox() const;
95 96
97 void setEntityId(const QString &id);
98 QString entityId() const;
99
96private: 100private:
97 void fetchMail(Sink::ApplicationDomain::Mail::Ptr mail); 101 void fetchMail(Sink::ApplicationDomain::Mail::Ptr mail);
98 102
diff --git a/tests/teststore.cpp b/tests/teststore.cpp
index e5a3ea88..24067f4f 100644
--- a/tests/teststore.cpp
+++ b/tests/teststore.cpp
@@ -160,6 +160,9 @@ QVariant TestStore::load(const QByteArray &type, const QVariantMap &filter)
160 using namespace Sink::ApplicationDomain; 160 using namespace Sink::ApplicationDomain;
161 const auto list = loadList(type, filter); 161 const auto list = loadList(type, filter);
162 if (!list.isEmpty()) { 162 if (!list.isEmpty()) {
163 if(list.size() > 1) {
164 qWarning() << "While loading" << type << "with filter" << filter << "; got multiple elements, but returning the first one.";
165 }
163 return list.first(); 166 return list.first();
164 } 167 }
165 return {}; 168 return {};
@@ -183,6 +186,17 @@ QVariantList TestStore::loadList(const QByteArray &type, const QVariantMap &filt
183 if (filter.contains("resource")) { 186 if (filter.contains("resource")) {
184 query.resourceFilter(filter.value("resource").toByteArray()); 187 query.resourceFilter(filter.value("resource").toByteArray());
185 } 188 }
189
190 for(QVariantMap::const_iterator it = filter.begin(); it != filter.end(); ++it) {
191 if(it.key() == "messageId") {
192 query.filter<Mail::MessageId>(it.value());
193 } else if(it.key() == "draft") {
194 query.filter<Mail::Draft>(it.value());
195 } else if(it.key() == "subject") {
196 query.filter<Mail::Subject>(it.value());
197 }
198 }
199
186 if (type == "mail") { 200 if (type == "mail") {
187 return toVariantList(Sink::Store::read<Mail>(query)); 201 return toVariantList(Sink::Store::read<Mail>(query));
188 } 202 }
@@ -205,6 +219,7 @@ QVariantMap TestStore::read(const QVariant &object)
205 using namespace Sink::ApplicationDomain; 219 using namespace Sink::ApplicationDomain;
206 QVariantMap map; 220 QVariantMap map;
207 if (auto mail = object.value<Mail::Ptr>()) { 221 if (auto mail = object.value<Mail::Ptr>()) {
222 map.insert("uid", mail->identifier());
208 map.insert("subject", mail->getSubject()); 223 map.insert("subject", mail->getSubject());
209 map.insert("draft", mail->getDraft()); 224 map.insert("draft", mail->getDraft());
210 return map; 225 return map;
diff --git a/views/log/main.qml b/views/log/main.qml
index e33d7945..f4f20582 100644
--- a/views/log/main.qml
+++ b/views/log/main.qml
@@ -111,6 +111,8 @@ ApplicationWindow {
111 entities: [] 111 entities: []
112 } 112 }
113 ) 113 )
114 var mail = TestStore.load("mail", {messageId: "msg1@test.com"})
115 var mail_uid = TestStore.read(mail).uid
114 Kube.Fabric.postMessage( 116 Kube.Fabric.postMessage(
115 Kube.Messages.notification, 117 Kube.Messages.notification,
116 { 118 {
@@ -118,7 +120,19 @@ ApplicationWindow {
118 "subtype": Kube.Notifications.transmissionError, 120 "subtype": Kube.Notifications.transmissionError,
119 message: "merge1", 121 message: "merge1",
120 resource: "resource1", 122 resource: "resource1",
121 entities: ["<msg1@test.com>"] 123 entities: [mail_uid]
124 }
125 )
126 var mail2 = TestStore.load("mail", {messageId: "msg2@test.com"})
127 var mail2_uid = TestStore.read(mail2).uid
128 Kube.Fabric.postMessage(
129 Kube.Messages.notification,
130 {
131 "type": Kube.Notifications.error,
132 "subtype": Kube.Notifications.transmissionError,
133 message: "merge1",
134 resource: "resource1",
135 entities: [mail2_uid]
122 } 136 }
123 ) 137 )
124 Kube.Fabric.postMessage( 138 Kube.Fabric.postMessage(
@@ -128,7 +142,7 @@ ApplicationWindow {
128 "subtype": "customSubType", 142 "subtype": "customSubType",
129 message: "merge1", 143 message: "merge1",
130 resource: "resource1", 144 resource: "resource1",
131 entities: ["entity1", "entity2"] 145 entities: []
132 } 146 }
133 ) 147 )
134 } 148 }
diff --git a/views/log/main.qml.bak b/views/log/main.qml.bak
new file mode 100644
index 00000000..fbe47238
--- /dev/null
+++ b/views/log/main.qml.bak
@@ -0,0 +1,139 @@
1/*
2 * Copyright (C) 2018 Christian Mollekopf, <mollekopf@kolabsys.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19import QtQuick 2.7
20import QtQuick.Controls 2.0
21import QtQuick.Window 2.0
22
23import org.kube.framework 1.0 as Kube
24import org.kube.test 1.0
25import "qml"
26
27ApplicationWindow {
28 id: app
29 height: Screen.desktopAvailableHeight * 0.8
30 width: Screen.desktopAvailableWidth * 0.8
31
32 Component.onCompleted: {
33 var initialState = {
34 accounts: [{
35 id: "account1",
36 name: "Test Account"
37 }],
38 identities: [{
39 account: "account1",
40 name: "Test Identity",
41 address: "identity@example.org"
42 }],
43 resources: [{
44 id: "resourceaccount1",
45 account: "account1",
46 type: "dummy"
47 },
48 {
49 id: "resourceaccount2",
50 account: "account1",
51 type: "mailtransport"
52 }],
53 folders: [{
54 id: "folder1",
55 resource: "resourcefolder1",
56 name: "Folder 1",
57 specialpurpose: ["drafts"],
58 mails: [{
59 resource: "resourcemail1",
60 messageId: "<msg1@test.com>",
61 date: "2017-07-24T15:46:29",
62 subject: "subject1",
63 body: "body",
64 to: ["to@example.org"],
65 cc: ["cc@example.org"],
66 bcc: ["bcc@example.org"],
67 draft: true
68 },
69 {
70 resource: "resourcemail2",
71 messageId: "<msg2@test.com>",
72 date: "2017-07-23T15:46:29",
73 subject: "LooooooooooooooooooooooooooooooooooooooooooooooooooooooooonggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggEnd",
74 body: "LooooooooooooooooooooooooooooooooooooooooooooooooooooooooonggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggEnd\nbody\nbody\n\n\nbody\n\n\nbody\n\n\nbody\n\n\nbody\nbody\n\n\nbody\n\n\nbody\n\n\nbody\n\n\nbody\n\n\n\n\n\n\n\n\nbody\nbody\n\n\nbody\n\n\nbody\n\n\nbody\n\n\nbody\n\n\nbody",
75 to: ["toLoooooooooooooooooooooooooooooooooooooooooooooooooong@example.org"],
76 cc: ["ccLoooooooooooooooooooooooooooooooooooooooooooooooooong@example.org"],
77 bcc: ["bccLoooooooooooooooooooooooooooooooooooooooooooooooooong@example.org"],
78 draft: true
79 }
80 ]
81 }],
82 }
83 TestStore.setup(initialState)
84 Kube.Fabric.postMessage(
85 Kube.Messages.notification,
86 {
87 "type": Kube.Notifications.error,
88 "subtype": Kube.Notifications.loginError,
89 message: "merge1",
90 resource: "resourceaccount1",
91 entities: []
92 }
93 );
94 Kube.Fabric.postMessage(
95 Kube.Messages.notification,
96 {
97 "type": Kube.Notifications.error,
98 "subtype": Kube.Notifications.hostNotFoundError,
99 message: "merge1",
100 resource: "resourceaccount1",
101 entities: []
102 }
103 )
104 Kube.Fabric.postMessage(
105 Kube.Messages.notification,
106 {
107 "type": Kube.Notifications.error,
108 "subtype": Kube.Notifications.connectionError,
109 message: "merge1",
110 resource: "resource1account",
111 entities: []
112 }
113 )
114 Kube.Fabric.postMessage(
115 Kube.Messages.notification,
116 {
117 "type": Kube.Notifications.error,
118 "subtype": Kube.Notifications.transmissionError,
119 message: "merge1",
120 resource: "resourceaccount1",
121 entities: ["resourcemail1"]
122 }
123 )
124 Kube.Fabric.postMessage(
125 Kube.Messages.notification,
126 {
127 "type": Kube.Notifications.error,
128 "subtype": "customSubType",
129 message: "merge1",
130 resource: "resource1",
131 entities: []
132 }
133 )
134 }
135
136 View {
137 anchors.fill: parent
138 }
139}
diff --git a/views/log/qml/View.qml b/views/log/qml/View.qml
index 0dbf3b5e..7e95e20f 100644
--- a/views/log/qml/View.qml
+++ b/views/log/qml/View.qml
@@ -46,14 +46,16 @@ Controls.SplitView {
46 root.pendingError = true 46 root.pendingError = true
47 } 47 }
48 48
49 console.log("Message: " + message.message) 49 var error = {
50 console.log("Type: " + message.type) 50 timestamp: new Date(),
51 console.log("SubType: " + message.subtype) 51 message: message.message,
52 console.log("Entities: " + message.entities) 52 details: message.details,
53 53 resource: message.resource,
54 var error = {timestamp: new Date(), message: message.message, details: message.details, resource: message.resource, entities: message.entities} 54 // TODO: if we passed entities as a list, it would get
55 55 // converted to a ListModel, in all likelihood because of
56 console.log("Error: " + JSON.stringify(error)) 56 // ListDelegate, which we should rewrite in C++
57 entities: {elements: message.entities}
58 }
57 59
58 if (logModel.count > 0) { 60 if (logModel.count > 0) {
59 var lastEntry = logModel.get(0) 61 var lastEntry = logModel.get(0)
@@ -88,7 +90,6 @@ Controls.SplitView {
88 90
89 onCurrentItemChanged: { 91 onCurrentItemChanged: {
90 var error = currentItem.currentData.errors.get(0) 92 var error = currentItem.currentData.errors.get(0)
91 console.log("Current error: " + JSON.stringify(error));
92 if (!!error.resource) { 93 if (!!error.resource) {
93 details.resourceId = error.resource 94 details.resourceId = error.resource
94 } 95 }
@@ -100,9 +101,6 @@ Controls.SplitView {
100 details.subtype = "" 101 details.subtype = ""
101 } 102 }
102 103
103 console.log("Setting resource to: " + error.resource)
104 console.log("Setting entities to: " + error.entities)
105
106 details.entities = error.entities 104 details.entities = error.entities
107 } 105 }
108 106
@@ -357,19 +355,49 @@ Controls.SplitView {
357 right: parent.right 355 right: parent.right
358 } 356 }
359 spacing: Kube.Units.largeSpacing 357 spacing: Kube.Units.largeSpacing
358
359 Kube.Heading {
360 id: heading
361 text: qsTr("Failed to send the message.")
362 color: Kube.Colors.warningColor
363 }
364
360 Column { 365 Column {
361 Kube.Heading { 366 spacing: Kube.Units.largeSpacing
362 id: heading 367
363 text: qsTr("Failed to send the message.") 368 Repeater {
364 color: Kube.Colors.warningColor 369 model: Kube.MailListModel {
365 } 370 entityId: entities.elements[0]
366 Kube.Label { 371 }
367 id: subHeadline 372 delegate: Column {
368 text: "Account: " + accountName + "\nMessage-Id: " + entities; 373 id: subHeadline
369 color: Kube.Colors.disabledTextColor 374
370 wrapMode: Text.Wrap 375 Kube.Label {
376 text: qsTr("Account") + ": " + accountName
377 color: Kube.Colors.disabledTextColor
378 wrapMode: Text.Wrap
379 }
380 Kube.Label {
381 text: qsTr("Subject") + ": " + model.subject
382 color: Kube.Colors.disabledTextColor
383 wrapMode: Text.Wrap
384 }
385 Kube.Label {
386 text: qsTr("To") + ": " + model.to
387 color: Kube.Colors.disabledTextColor
388 wrapMode: Text.Wrap
389 }
390 Kube.Label {
391 visible: !!model.cc
392 text: qsTr("Cc") + ": " + model.cc;
393 color: Kube.Colors.disabledTextColor
394 wrapMode: Text.Wrap
395 }
396
397 }
371 } 398 }
372 } 399 }
400
373 Kube.Button { 401 Kube.Button {
374 text: qsTr("Try again") 402 text: qsTr("Try again")
375 onClicked: { 403 onClicked: {