proton-bridge/internal/frontend/qml/ProtonUI/BugReportWindow.qml

357 lines
11 KiB
QML

// Copyright (c) 2021 Proton Technologies AG
//
// This file is part of ProtonMail Bridge.
//
// ProtonMail Bridge is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ProtonMail Bridge is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
// Window for sending a bug report
import QtQuick 2.8
import QtQuick.Window 2.2
import QtQuick.Controls 2.1
import ProtonUI 1.0
import QtGraphicalEffects 1.0
Window {
id:root
property alias userAddress : userAddress
property alias clientVersion : clientVersion
width : Style.bugreport.width
height : Style.bugreport.height
minimumWidth : Style.bugreport.width
maximumWidth : Style.bugreport.width
minimumHeight : Style.bugreport.height
maximumHeight : Style.bugreport.height
property color inputBorderColor : Style.main.text
color : "transparent"
flags : Qt.Window | Qt.Dialog | Qt.FramelessWindowHint
title : "Bug report"
visible : false
WindowTitleBar {
id: titleBar
window: root
}
Rectangle {
id:background
color: Style.main.background
anchors {
left : parent.left
right : parent.right
top : titleBar.bottom
bottom : parent.bottom
}
border {
width: Style.main.border
color: Style.tabbar.background
}
}
Rectangle {
id:content
anchors {
fill : parent
leftMargin : Style.main.leftMargin
rightMargin : Style.main.rightMargin
bottomMargin : Style.main.rightMargin
topMargin : Style.main.rightMargin + titleBar.height
}
color: "transparent"
// Description in flickable
Flickable {
id: descripWrapper
anchors {
left: parent.left
right: parent.right
top: parent.top
}
height: content.height - (
(clientVersion.visible ? clientVersion.height + Style.dialog.fontSize : 0) +
userAddress.height + Style.dialog.fontSize +
securityNoteText.contentHeight + Style.dialog.fontSize +
cancelButton.height + Style.dialog.fontSize
)
clip: true
contentWidth : width
contentHeight : height
TextArea.flickable: TextArea {
id: description
focus: true
wrapMode: TextEdit.Wrap
placeholderText: qsTr ("Please briefly describe the bug(s) you have encountered...", "bug report instructions")
background : Rectangle {
color : Style.dialog.background
radius: Style.dialog.radiusButton
border {
color : root.inputBorderColor
width : Style.dialog.borderInput
}
layer.enabled: true
layer.effect: FastBlur {
anchors.fill: parent
radius: 8 * Style.px
}
}
color: Style.main.text
font.pointSize: Style.dialog.fontSize * Style.pt
selectionColor: Style.main.textBlue
selectByKeyboard: true
selectByMouse: true
KeyNavigation.tab: clientVersion
KeyNavigation.priority: KeyNavigation.BeforeItem
}
ScrollBar.vertical : ScrollBar{}
}
// Client
TextLabel {
anchors {
left: parent.left
top: descripWrapper.bottom
topMargin: Style.dialog.fontSize
}
visible: clientVersion.visible
width: parent.width/2.618
text: qsTr ("Email client:", "in the bug report form, which third-party email client is being used")
font.pointSize: Style.dialog.fontSize * Style.pt
}
TextField {
id: clientVersion
anchors {
right: parent.right
top: descripWrapper.bottom
topMargin: Style.dialog.fontSize
}
placeholderText: qsTr("e.g. Thunderbird", "in the bug report form, placeholder text for email client")
width: parent.width/1.618
color : Style.dialog.text
selectionColor : Style.main.textBlue
selectByMouse : true
font.pointSize : Style.dialog.fontSize * Style.pt
padding : Style.dialog.radiusButton
background: Rectangle {
color : Style.dialog.background
radius: Style.dialog.radiusButton
border {
color : root.inputBorderColor
width : Style.dialog.borderInput
}
layer.enabled: true
layer.effect: FastBlur {
anchors.fill: parent
radius: 8 * Style.px
}
}
onAccepted: userAddress.focus = true
}
// Address
TextLabel {
anchors {
left: parent.left
top: clientVersion.visible ? clientVersion.bottom : descripWrapper.bottom
topMargin: Style.dialog.fontSize
}
color: Style.dialog.text
width: parent.width/2.618
text: qsTr ("Contact email:", "in the bug report form, an email to contact the user at")
font.pointSize: Style.dialog.fontSize * Style.pt
}
TextField {
id: userAddress
anchors {
right: parent.right
top: clientVersion.visible ? clientVersion.bottom : descripWrapper.bottom
topMargin: Style.dialog.fontSize
}
placeholderText: "benjerry@protonmail.com"
width: parent.width/1.618
color : Style.dialog.text
selectionColor : Style.main.textBlue
selectByMouse : true
font.pointSize : Style.dialog.fontSize * Style.pt
padding : Style.dialog.radiusButton
background: Rectangle {
color : Style.dialog.background
radius: Style.dialog.radiusButton
border {
color : root.inputBorderColor
width : Style.dialog.borderInput
}
layer.enabled: true
layer.effect: FastBlur {
anchors.fill: parent
radius: 8 * Style.px
}
}
onAccepted: root.submit()
}
// Note
Row {
id: securityNote
anchors {
left: parent.left
right: parent.right
top: userAddress.bottom
topMargin: Style.dialog.fontSize
}
Text {
id: securityNoteIcon
font {
pointSize : Style.dialog.fontSize * Style.pt
family : Style.fontawesome.name
}
color: Style.dialog.text
text : Style.fa.exclamation_triangle
}
AccessibleText {
id: securityNoteText
anchors {
left: securityNoteIcon.right
leftMargin: 5 * Style.pt
right: parent.right
}
wrapMode: Text.Wrap
color: Style.dialog.text
font.pointSize : Style.dialog.fontSize * Style.pt
text:
qsTr("Bug reports are not end-to-end encrypted!", "The first part of warning in bug report form") + " " +
qsTr("Please do not send any sensitive information.", "The second part of warning in bug report form") + " " +
qsTr("Contact us at security@protonmail.com for critical security issues.", "The third part of warning in bug report form")
}
}
// buttons
ButtonRounded {
id: cancelButton
anchors {
left: parent.left
bottom: parent.bottom
}
fa_icon: Style.fa.times
text: qsTr ("Cancel", "dismisses current action")
onClicked : root.hide()
}
ButtonRounded {
anchors {
right: parent.right
bottom: parent.bottom
}
isOpaque: true
color_main: "white"
color_minor: Style.main.textBlue
fa_icon: Style.fa.send
text: qsTr ("Send", "button sends bug report")
onClicked : root.submit()
}
}
Rectangle {
id: notification
property bool isOK: true
visible: false
color: background.color
anchors.fill: background
Text {
anchors.centerIn: parent
color: Style.dialog.text
width: background.width*0.6180
text: notification.isOK ?
qsTr ( "Bug report successfully sent." , "notification message about bug sending" ) :
qsTr ( "Unable to submit bug report." , "notification message about bug sending" )
horizontalAlignment: Text.AlignHCenter
font.pointSize: Style.dialog.titleSize * Style.pt
}
Timer {
id: notificationTimer
interval: 3000
repeat: false
onTriggered : {
notification.visible=false
if (notification.isOK) root.hide()
}
}
}
function submit(){
if(root.areInputsOK()){
root.notify(go.sendBug(description.text, clientVersion.text, userAddress.text ))
}
}
function isEmpty(input){
if (input.text=="") {
input.focus=true
input.placeholderText = qsTr("Field required", "a field that must be filled in to submit form")
return true
}
return false
}
function areInputsOK() {
var isOK = true
if (isEmpty(userAddress)) { isOK=false }
if (clientVersion.visible && isEmpty(clientVersion)) { isOK=false }
if (isEmpty(description)) { isOK=false }
return isOK
}
function clear() {
description.text = ""
clientVersion.text = ""
notification.visible = false
}
signal prefill()
function notify(isOK){
notification.isOK = isOK
notification.visible = true
notificationTimer.start()
}
function show() {
prefill()
description.focus=true
root.visible=true
}
function hide() {
clear()
root.visible=false
}
}