diff options
Diffstat (limited to 'views')
-rw-r--r-- | views/log/main.qml | 153 | ||||
-rw-r--r-- | views/log/qml/View.qml | 67 |
2 files changed, 209 insertions, 11 deletions
diff --git a/views/log/main.qml b/views/log/main.qml new file mode 100644 index 00000000..f4f20582 --- /dev/null +++ b/views/log/main.qml | |||
@@ -0,0 +1,153 @@ | |||
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 | |||
19 | import QtQuick 2.7 | ||
20 | import QtQuick.Controls 2.0 | ||
21 | import QtQuick.Window 2.0 | ||
22 | |||
23 | import org.kube.framework 1.0 as Kube | ||
24 | import org.kube.test 1.0 | ||
25 | import "qml" | ||
26 | |||
27 | ApplicationWindow { | ||
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: "resource1", | ||
45 | account: "account1", | ||
46 | type: "dummy" | ||
47 | }, | ||
48 | { | ||
49 | id: "resource2", | ||
50 | account: "account1", | ||
51 | type: "mailtransport" | ||
52 | }], | ||
53 | folders: [{ | ||
54 | id: "folder1", | ||
55 | resource: "resource1", | ||
56 | name: "Folder 1", | ||
57 | specialpurpose: ["drafts"], | ||
58 | mails: [{ | ||
59 | resource: "resource1", | ||
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: "resource1", | ||
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: "resource1", | ||
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: "resource1", | ||
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: "resource1", | ||
111 | entities: [] | ||
112 | } | ||
113 | ) | ||
114 | var mail = TestStore.load("mail", {messageId: "msg1@test.com"}) | ||
115 | var mail_uid = TestStore.read(mail).uid | ||
116 | Kube.Fabric.postMessage( | ||
117 | Kube.Messages.notification, | ||
118 | { | ||
119 | "type": Kube.Notifications.error, | ||
120 | "subtype": Kube.Notifications.transmissionError, | ||
121 | message: "merge1", | ||
122 | resource: "resource1", | ||
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] | ||
136 | } | ||
137 | ) | ||
138 | Kube.Fabric.postMessage( | ||
139 | Kube.Messages.notification, | ||
140 | { | ||
141 | "type": Kube.Notifications.error, | ||
142 | "subtype": "customSubType", | ||
143 | message: "merge1", | ||
144 | resource: "resource1", | ||
145 | entities: [] | ||
146 | } | ||
147 | ) | ||
148 | } | ||
149 | |||
150 | View { | ||
151 | anchors.fill: parent | ||
152 | } | ||
153 | } | ||
diff --git a/views/log/qml/View.qml b/views/log/qml/View.qml index 14e2d543..7e95e20f 100644 --- a/views/log/qml/View.qml +++ b/views/log/qml/View.qml | |||
@@ -45,7 +45,18 @@ Controls.SplitView { | |||
45 | if (message.type == Kube.Notifications.error) { | 45 | if (message.type == Kube.Notifications.error) { |
46 | root.pendingError = true | 46 | root.pendingError = true |
47 | } | 47 | } |
48 | var error = {timestamp: new Date(), message: message.message, details: message.details, resource: message.resource} | 48 | |
49 | var error = { | ||
50 | timestamp: new Date(), | ||
51 | message: message.message, | ||
52 | details: message.details, | ||
53 | resource: message.resource, | ||
54 | // TODO: if we passed entities as a list, it would get | ||
55 | // converted to a ListModel, in all likelihood because of | ||
56 | // ListDelegate, which we should rewrite in C++ | ||
57 | entities: {elements: message.entities} | ||
58 | } | ||
59 | |||
49 | if (logModel.count > 0) { | 60 | if (logModel.count > 0) { |
50 | var lastEntry = logModel.get(0) | 61 | var lastEntry = logModel.get(0) |
51 | //Merge if we get an entry of the same subtype | 62 | //Merge if we get an entry of the same subtype |
@@ -89,6 +100,8 @@ Controls.SplitView { | |||
89 | } else { | 100 | } else { |
90 | details.subtype = "" | 101 | details.subtype = "" |
91 | } | 102 | } |
103 | |||
104 | details.entities = error.entities | ||
92 | } | 105 | } |
93 | 106 | ||
94 | delegate: Kube.ListDelegate { | 107 | delegate: Kube.ListDelegate { |
@@ -145,6 +158,7 @@ Controls.SplitView { | |||
145 | property date timestamp | 158 | property date timestamp |
146 | property string message: "" | 159 | property string message: "" |
147 | property string resourceId: "" | 160 | property string resourceId: "" |
161 | property var entities: [] | ||
148 | 162 | ||
149 | Kube.ModelIndexRetriever { | 163 | Kube.ModelIndexRetriever { |
150 | id: retriever | 164 | id: retriever |
@@ -166,6 +180,7 @@ Controls.SplitView { | |||
166 | property string resourceId: details.resourceId | 180 | property string resourceId: details.resourceId |
167 | property string accountId: retriever.currentData ? retriever.currentData.accountId : "" | 181 | property string accountId: retriever.currentData ? retriever.currentData.accountId : "" |
168 | property string accountName: retriever.currentData ? retriever.currentData.name : "" | 182 | property string accountName: retriever.currentData ? retriever.currentData.name : "" |
183 | property var entities: details.entities | ||
169 | 184 | ||
170 | function getComponent(subtype) { | 185 | function getComponent(subtype) { |
171 | if (subtype == Kube.Notifications.loginError) { | 186 | if (subtype == Kube.Notifications.loginError) { |
@@ -340,19 +355,49 @@ Controls.SplitView { | |||
340 | right: parent.right | 355 | right: parent.right |
341 | } | 356 | } |
342 | 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 | |||
343 | Column { | 365 | Column { |
344 | Kube.Heading { | 366 | spacing: Kube.Units.largeSpacing |
345 | id: heading | 367 | |
346 | text: qsTr("Failed to send the message.") | 368 | Repeater { |
347 | color: Kube.Colors.warningColor | 369 | model: Kube.MailListModel { |
348 | } | 370 | entityId: entities.elements[0] |
349 | Kube.Label { | 371 | } |
350 | id: subHeadline | 372 | delegate: Column { |
351 | text: accountName | 373 | id: subHeadline |
352 | color: Kube.Colors.disabledTextColor | 374 | |
353 | 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 | } | ||
354 | } | 398 | } |
355 | } | 399 | } |
400 | |||
356 | Kube.Button { | 401 | Kube.Button { |
357 | text: qsTr("Try again") | 402 | text: qsTr("Try again") |
358 | onClicked: { | 403 | onClicked: { |