Warning, /pim/kube/views/log/qml/View.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright (C) 2017 Michael Bohlender, <michael.bohlender@kdemail.net> 0003 * Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsys.com> 0004 * 0005 * This program is free software; you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation; either version 2 of the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 * GNU General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License along 0016 * with this program; if not, write to the Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0018 */ 0019 0020 import QtQuick 2.4 0021 import QtQuick.Layouts 1.1 0022 import QtQuick.Controls 1.3 as Controls1 0023 import QtQuick.Controls 2 0024 import org.kube.framework 1.0 as Kube 0025 0026 Controls1.SplitView { 0027 id: root 0028 0029 property bool pendingError: false; 0030 property bool pendingNotification: false; 0031 onPendingErrorChanged: { 0032 Kube.Fabric.postMessage(Kube.Messages.errorPending, {errorPending: pendingError}) 0033 } 0034 onPendingNotificationChanged: { 0035 Kube.Fabric.postMessage(Kube.Messages.notificationPending, {notificationPending: pendingNotification}) 0036 } 0037 0038 StackView.onActivated: { 0039 root.pendingError = false; 0040 root.pendingNotification = false; 0041 //Always select the latest notification 0042 listView.currentIndex = 0 0043 } 0044 0045 Item { 0046 id: accountList 0047 width: parent.width/3 0048 Layout.fillHeight: true 0049 0050 Kube.Listener { 0051 filter: Kube.Messages.notification 0052 onMessageReceived: { 0053 //Ignore noise that we can't usefully render anyways 0054 if (!message.message) { 0055 return 0056 } 0057 //Avoid highlighting the iconbutton again if we're already looking at this view. 0058 if (root.StackView.status != StackView.Active) { 0059 if (message.type == Kube.Notifications.error) { 0060 root.pendingError = true 0061 } 0062 root.pendingNotification = true 0063 } 0064 logModel.insert(message) 0065 } 0066 } 0067 0068 Kube.Label { 0069 anchors.centerIn: parent 0070 visible: listView.count == 0 0071 text: qsTr("Nothing here...") 0072 } 0073 0074 Kube.ListView { 0075 id: listView 0076 anchors { 0077 fill: parent 0078 } 0079 0080 clip: true 0081 0082 model: Kube.LogModel { 0083 id: logModel 0084 objectName: "logModel" 0085 onEntryAdded: { 0086 Kube.Fabric.postMessage(Kube.Messages.displayNotification, message) 0087 } 0088 } 0089 0090 onCurrentItemChanged: { 0091 if (!!currentItem.currentData.resource) { 0092 details.resourceId = currentItem.currentData.resource 0093 } 0094 details.message = currentItem.currentData.message + "\n" + currentItem.currentData.details 0095 details.timestamp = currentItem.currentData.timestamp 0096 details.entities = currentItem.currentData.entities 0097 if (!!currentItem.currentData.subtype) { 0098 details.subtype = currentItem.currentData.subtype 0099 } else { 0100 details.subtype = "" 0101 } 0102 } 0103 0104 delegate: Kube.ListDelegate { 0105 id: delegateRoot 0106 border.color: Kube.Colors.buttonColor 0107 border.width: 1 0108 Kube.Label { 0109 id: description 0110 anchors { 0111 top: parent.top 0112 topMargin: Kube.Units.smallSpacing 0113 left: parent.left 0114 leftMargin: Kube.Units.largeSpacing 0115 } 0116 height: Kube.Units.gridUnit 0117 width: parent.width - Kube.Units.largeSpacing * 2 0118 text: model.type == Kube.Notifications.error ? qsTr("Error") : qsTr("Info") 0119 } 0120 0121 Kube.Label { 0122 id: message 0123 anchors { 0124 topMargin: Kube.Units.smallSpacing 0125 top: description.bottom 0126 left: parent.left 0127 leftMargin: Kube.Units.largeSpacing 0128 } 0129 height: Kube.Units.gridUnit 0130 width: parent.width - Kube.Units.largeSpacing * 2 0131 maximumLineCount: 1 0132 elide: Text.ElideRight 0133 color: delegateRoot.disabledTextColor 0134 text: model.message 0135 } 0136 0137 Kube.Label { 0138 id: date 0139 0140 anchors { 0141 right: parent.right 0142 bottom: parent.bottom 0143 rightMargin: Kube.Units.smallSpacing 0144 } 0145 text: Qt.formatDateTime(model.timestamp, " hh:mm:ss dd MMM yyyy") 0146 font.italic: true 0147 color: delegateRoot.disabledTextColor 0148 font.pointSize: Kube.Units.smallFontSize 0149 } 0150 } 0151 } 0152 } 0153 Item { 0154 id: details 0155 property string subtype: "" 0156 property date timestamp 0157 property string message: "" 0158 property string resourceId: "" 0159 property var entities: [] 0160 0161 Kube.ModelIndexRetriever { 0162 id: retriever 0163 model: Kube.AccountsModel { 0164 resourceId: details.resourceId 0165 } 0166 } 0167 0168 Loader { 0169 id: detailsLoader 0170 visible: message != "" 0171 clip: true 0172 anchors { 0173 fill: parent 0174 margins: Kube.Units.largeSpacing 0175 } 0176 property date timestamp: details.timestamp 0177 property string message: details.message 0178 property string resourceId: details.resourceId 0179 property string accountId: retriever.currentData ? retriever.currentData.accountId : "" 0180 property string accountName: retriever.currentData ? retriever.currentData.name : "" 0181 property string entityId: (details.entities && details.entities.length != 0) ? details.entities[0] : "" 0182 0183 function getComponent(subtype) { 0184 if (subtype == Kube.Notifications.loginError) { 0185 return loginErrorComponent 0186 } 0187 if (subtype == Kube.Notifications.hostNotFoundError) { 0188 return hostNotFoundErrorComponent 0189 } 0190 if (subtype == Kube.Notifications.connectionError) { 0191 return hostNotFoundErrorComponent 0192 } 0193 if (subtype == Kube.Notifications.transmissionError) { 0194 return transmissionErrorComponent 0195 } 0196 if (subtype == Kube.Notifications.messageSent) { 0197 return transmissionSuccessComponent 0198 } 0199 return detailsComponent 0200 } 0201 0202 sourceComponent: getComponent(details.subtype) 0203 } 0204 } 0205 0206 Component { 0207 id: detailsComponent 0208 Rectangle { 0209 color: Kube.Colors.viewBackgroundColor 0210 GridLayout { 0211 id: gridLayout 0212 Layout.minimumWidth: 0 0213 anchors { 0214 top: parent.top 0215 left: parent.left 0216 right: parent.right 0217 } 0218 columns: 2 0219 Kube.Label { 0220 text: qsTr("Account:") 0221 visible: accountName 0222 } 0223 Kube.Label { 0224 Layout.fillWidth: true 0225 text: accountName 0226 visible: accountName 0227 elide: Text.ElideRight 0228 } 0229 Kube.Label { 0230 text: qsTr("Account Id:") 0231 visible: accountId 0232 } 0233 Kube.Label { 0234 text: accountId 0235 visible: accountId 0236 Layout.fillWidth: true 0237 elide: Text.ElideRight 0238 } 0239 Kube.Label { 0240 text: qsTr("Resource Id:") 0241 visible: resourceId 0242 } 0243 Kube.Label { 0244 text: resourceId 0245 visible: resourceId 0246 Layout.fillWidth: true 0247 elide: Text.ElideRight 0248 } 0249 Kube.Label { 0250 text: qsTr("Timestamp:") 0251 } 0252 Kube.Label { 0253 text: Qt.formatDateTime(timestamp, " hh:mm:ss dd MMM yyyy") 0254 Layout.fillWidth: true 0255 elide: Text.ElideRight 0256 } 0257 Kube.Label { 0258 text: qsTr("Message:") 0259 Layout.alignment: Qt.AlignTop 0260 } 0261 Kube.Label { 0262 text: message 0263 Layout.fillWidth: true 0264 wrapMode: Text.Wrap 0265 } 0266 Item { 0267 Layout.columnSpan: 2 0268 Layout.fillHeight: true 0269 Layout.fillWidth: true 0270 } 0271 } 0272 0273 Kube.SelectableItem { 0274 layout: gridLayout 0275 } 0276 } 0277 } 0278 0279 Component { 0280 id: loginErrorComponent 0281 Item { 0282 Column { 0283 anchors { 0284 top: parent.top 0285 left: parent.left 0286 right: parent.right 0287 } 0288 spacing: Kube.Units.largeSpacing 0289 Column { 0290 Kube.Heading { 0291 id: heading 0292 text: qsTr("Failed to login") 0293 color: Kube.Colors.warningColor 0294 } 0295 0296 Kube.Label { 0297 id: subHeadline 0298 text: qsTr("%1: please check your credentials.").arg(accountName) 0299 color: Kube.Colors.disabledTextColor 0300 wrapMode: Text.Wrap 0301 } 0302 } 0303 Kube.Button { 0304 text: qsTr("Change Password") 0305 onClicked: { 0306 Kube.Fabric.postMessage(Kube.Messages.componentDone, {}) 0307 Kube.Fabric.postMessage(Kube.Messages.requestLogin, {accountId: accountId}) 0308 } 0309 } 0310 } 0311 } 0312 } 0313 0314 Component { 0315 id: hostNotFoundErrorComponent 0316 Item { 0317 Column { 0318 anchors { 0319 top: parent.top 0320 left: parent.left 0321 right: parent.right 0322 } 0323 spacing: Kube.Units.largeSpacing 0324 Column { 0325 Kube.Heading { 0326 id: heading 0327 text: qsTr("Host not found") 0328 color: Kube.Colors.warningColor 0329 } 0330 0331 Kube.Label { 0332 id: subHeadline 0333 text: qsTr("%1: please check your network connection and settings.").arg(accountName) 0334 color: Kube.Colors.disabledTextColor 0335 wrapMode: Text.Wrap 0336 } 0337 } 0338 Kube.Button { 0339 text: qsTr("Account Settings") 0340 onClicked: { 0341 Kube.Fabric.postMessage(Kube.Messages.componentDone, {}) 0342 Kube.Fabric.postMessage(Kube.Messages.requestAccountsConfiguration, {}) 0343 } 0344 } 0345 } 0346 } 0347 } 0348 0349 Component { 0350 id: transmissionErrorComponent 0351 Item { 0352 id: componentRoot 0353 Column { 0354 anchors { 0355 top: parent.top 0356 left: parent.left 0357 right: parent.right 0358 } 0359 spacing: Kube.Units.largeSpacing 0360 0361 Kube.Heading { 0362 id: heading 0363 text: qsTr("Failed to send the message.") 0364 color: Kube.Colors.warningColor 0365 } 0366 0367 Column { 0368 spacing: Kube.Units.largeSpacing 0369 0370 Repeater { 0371 model: Kube.MailListModel { 0372 filter: { 0373 "entityId": componentRoot.parent ? componentRoot.parent.entityId : null, 0374 "headersOnly": true, 0375 "fetchMails": true 0376 } 0377 } 0378 delegate: Column { 0379 id: subHeadline 0380 0381 Kube.Label { 0382 text: qsTr("Account: %1").arg(accountName) 0383 color: Kube.Colors.disabledTextColor 0384 wrapMode: Text.Wrap 0385 } 0386 Kube.Label { 0387 text: qsTr("Subject: %1").arg(model.subject) 0388 color: Kube.Colors.disabledTextColor 0389 wrapMode: Text.Wrap 0390 } 0391 Kube.Label { 0392 text: qsTr("To: %1").arg(model.to) 0393 color: Kube.Colors.disabledTextColor 0394 wrapMode: Text.Wrap 0395 } 0396 Kube.Label { 0397 visible: !!model.cc 0398 text: qsTr("Cc: %1").arg(model.cc) 0399 color: Kube.Colors.disabledTextColor 0400 wrapMode: Text.Wrap 0401 } 0402 0403 } 0404 } 0405 } 0406 0407 Kube.Button { 0408 text: qsTr("Try Again") 0409 onClicked: { 0410 Kube.Fabric.postMessage(Kube.Messages.sendOutbox, {}) 0411 } 0412 } 0413 } 0414 } 0415 } 0416 0417 Component { 0418 id: transmissionSuccessComponent 0419 Item { 0420 id: componentRoot 0421 Column { 0422 anchors { 0423 top: parent.top 0424 left: parent.left 0425 right: parent.right 0426 } 0427 spacing: Kube.Units.largeSpacing 0428 0429 Kube.Heading { 0430 id: heading 0431 text: qsTr("Succeeded to send the message.") 0432 } 0433 0434 Column { 0435 spacing: Kube.Units.largeSpacing 0436 0437 Repeater { 0438 model: Kube.MailListModel { 0439 filter: { 0440 "entityId": componentRoot.parent ? componentRoot.parent.entityId : null, 0441 "headersOnly": true, 0442 "fetchMails": true 0443 } 0444 } 0445 delegate: Column { 0446 id: subHeadline 0447 0448 Kube.Label { 0449 text: qsTr("Account: %1").arg(accountName) 0450 color: Kube.Colors.disabledTextColor 0451 wrapMode: Text.Wrap 0452 } 0453 Kube.Label { 0454 text: qsTr("Subject: %1").arg(model.subject) 0455 color: Kube.Colors.disabledTextColor 0456 wrapMode: Text.Wrap 0457 } 0458 Kube.Label { 0459 text: qsTr("To: %1").arg(model.to) 0460 color: Kube.Colors.disabledTextColor 0461 wrapMode: Text.Wrap 0462 } 0463 Kube.Label { 0464 visible: !!model.cc 0465 text: qsTr("Cc: %1").arg(model.cc) 0466 color: Kube.Colors.disabledTextColor 0467 wrapMode: Text.Wrap 0468 } 0469 } 0470 } 0471 } 0472 } 0473 } 0474 } 0475 0476 }