feat(@desktop/wallet): New Error component defined for simple send
fixes #16707
This commit is contained in:
parent
77368f469a
commit
acb07859b0
|
@ -0,0 +1,80 @@
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQuick.Controls 2.14
|
||||||
|
import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
|
import Storybook 1.0
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
import AppLayouts.Wallet.controls 1.0
|
||||||
|
|
||||||
|
SplitView {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
orientation: Qt.Vertical
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
SplitView.fillHeight: true
|
||||||
|
SplitView.fillWidth: true
|
||||||
|
color: Theme.palette.baseColor3
|
||||||
|
RouterErrorTag {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: 400
|
||||||
|
|
||||||
|
errorTitle: ctrlText.text
|
||||||
|
buttonText: ctrlButtonText.text
|
||||||
|
errorDetails: ctrlErrorDetails.text
|
||||||
|
expandable: expandableCheckBox.checked
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Pane {
|
||||||
|
ColumnLayout {
|
||||||
|
CheckBox {
|
||||||
|
id: expandableCheckBox
|
||||||
|
text: "expandable"
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Label { text: "Text:" }
|
||||||
|
TextField {
|
||||||
|
id: ctrlText
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "Not enough ETH to pay gas fees"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Label { text: "Button text:" }
|
||||||
|
TextField {
|
||||||
|
id: ctrlButtonText
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "Add ETH"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Label { text: "Asset name:" }
|
||||||
|
TextField {
|
||||||
|
id: ctrlAssetName
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Label { text: "Error Details:" }
|
||||||
|
TextField {
|
||||||
|
id: ctrlErrorDetails
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "Error Details will be displayed here"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// category: Views
|
|
@ -1,11 +1,13 @@
|
||||||
import QtQuick 2.14
|
import QtQuick 2.14
|
||||||
import QtQuick.Controls 2.14
|
import QtQuick.Controls 2.14
|
||||||
|
import QtQml.Models 2.15
|
||||||
|
|
||||||
import StatusQ.Core.Theme 0.1
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
import Storybook 1.0
|
import Storybook 1.0
|
||||||
|
|
||||||
import AppLayouts.Wallet.views 1.0
|
import AppLayouts.Wallet.views 1.0
|
||||||
|
import AppLayouts.Wallet.controls 1.0
|
||||||
|
|
||||||
SplitView {
|
SplitView {
|
||||||
orientation: Qt.Vertical
|
orientation: Qt.Vertical
|
||||||
|
@ -25,6 +27,22 @@ SplitView {
|
||||||
error: errorCheckbox.checked
|
error: errorCheckbox.checked
|
||||||
|
|
||||||
onReviewSendClicked: logs.logEvent("review send clicked")
|
onReviewSendClicked: logs.logEvent("review send clicked")
|
||||||
|
|
||||||
|
errorTags: errorCheckbox.checked ? errorTagsModel: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectModel {
|
||||||
|
id: errorTagsModel
|
||||||
|
RouterErrorTag {
|
||||||
|
errorTitle: "Error 1"
|
||||||
|
buttonText: "Add ETH"
|
||||||
|
}
|
||||||
|
RouterErrorTag {
|
||||||
|
errorTitle: "Error 2"
|
||||||
|
buttonText: "Add ETH"
|
||||||
|
errorDetails: "Details will appear here"
|
||||||
|
expandable: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ import StatusQ.Controls 0.1
|
||||||
import StatusQ.Components 0.1
|
import StatusQ.Components 0.1
|
||||||
import StatusQ.Popups.Dialog 0.1
|
import StatusQ.Popups.Dialog 0.1
|
||||||
|
|
||||||
|
import AppLayouts.Wallet.controls 1.0
|
||||||
|
|
||||||
SplitView {
|
SplitView {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
@ -138,10 +140,26 @@ SplitView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errorTags: ctrlAddErrorTags.checked ? errorTagsModel: null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ObjectModel {
|
||||||
|
id: errorTagsModel
|
||||||
|
RouterErrorTag {
|
||||||
|
errorTitle: "Error 1"
|
||||||
|
buttonText: "Add ETH"
|
||||||
|
}
|
||||||
|
RouterErrorTag {
|
||||||
|
errorTitle: "Error 2"
|
||||||
|
buttonText: "Add ETH"
|
||||||
|
errorDetails: "Details will appear here"
|
||||||
|
expandable: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LogsAndControlsPanel {
|
LogsAndControlsPanel {
|
||||||
SplitView.preferredWidth: 320
|
SplitView.preferredWidth: 320
|
||||||
SplitView.fillHeight: true
|
SplitView.fillHeight: true
|
||||||
|
@ -238,6 +256,10 @@ SplitView {
|
||||||
id: ctrlHeaderDropShadow
|
id: ctrlHeaderDropShadow
|
||||||
text: "Header drop shadow"
|
text: "Header drop shadow"
|
||||||
}
|
}
|
||||||
|
CheckBox {
|
||||||
|
id: ctrlAddErrorTags
|
||||||
|
text: "Add error tags"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtTest 1.15
|
||||||
|
|
||||||
|
import AppLayouts.Wallet.controls 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: 600
|
||||||
|
height: 400
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: componentUnderTest
|
||||||
|
RouterErrorTag {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
errorTitle: "Not enough ETH to pay gas fees"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SignalSpy {
|
||||||
|
id: signalSpy
|
||||||
|
target: controlUnderTest
|
||||||
|
signalName: "buttonClicked"
|
||||||
|
}
|
||||||
|
|
||||||
|
property RouterErrorTag controlUnderTest: null
|
||||||
|
|
||||||
|
TestCase {
|
||||||
|
name: "RouterErrorTag"
|
||||||
|
when: windowShown
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
controlUnderTest = createTemporaryObject(componentUnderTest, root)
|
||||||
|
signalSpy.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_basicGeometry() {
|
||||||
|
verify(!!controlUnderTest)
|
||||||
|
verify(controlUnderTest.width > 0)
|
||||||
|
verify(controlUnderTest.height > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_DefaultState() {
|
||||||
|
verify(!!controlUnderTest)
|
||||||
|
const errorTitle = findChild(controlUnderTest, "errorTitle")
|
||||||
|
verify(!!errorTitle)
|
||||||
|
verify(errorTitle.visible)
|
||||||
|
const button = findChild(controlUnderTest, "addBalanceButton")
|
||||||
|
verify(!!button)
|
||||||
|
verify(!button.visible)
|
||||||
|
const expandButton = findChild(controlUnderTest, "expandButton")
|
||||||
|
verify(!!expandButton)
|
||||||
|
verify(!expandButton.visible)
|
||||||
|
const errorDetails = findChild(controlUnderTest, "errorDetails")
|
||||||
|
verify(!!errorDetails)
|
||||||
|
verify(!errorDetails.visible)
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_correctWidthWithButtonOrWithout() {
|
||||||
|
verify(!!controlUnderTest)
|
||||||
|
waitForRendering(controlUnderTest)
|
||||||
|
const origWidth = controlUnderTest.width
|
||||||
|
|
||||||
|
controlUnderTest.buttonText = "Add assets"
|
||||||
|
waitForRendering(controlUnderTest)
|
||||||
|
const widthWithButton = controlUnderTest.width
|
||||||
|
verify(widthWithButton > origWidth)
|
||||||
|
|
||||||
|
controlUnderTest.buttonText = ""
|
||||||
|
waitForRendering(controlUnderTest)
|
||||||
|
verify(controlUnderTest.width < widthWithButton)
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_addButtonClick() {
|
||||||
|
verify(!!controlUnderTest)
|
||||||
|
controlUnderTest.buttonText = "Add assets"
|
||||||
|
const button = findChild(controlUnderTest, "addBalanceButton")
|
||||||
|
verify(!!button)
|
||||||
|
verify(button.visible)
|
||||||
|
mouseClick(button)
|
||||||
|
tryCompare(signalSpy, "count", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_detailsVisibleOnceItHasValidText() {
|
||||||
|
verify(!!controlUnderTest)
|
||||||
|
const errorDetails = findChild(controlUnderTest, "errorDetails")
|
||||||
|
verify(!!errorDetails)
|
||||||
|
verify(!errorDetails.visible)
|
||||||
|
|
||||||
|
controlUnderTest.errorDetails = "Added some details here"
|
||||||
|
verify(errorDetails.visible)
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_expandableOption() {
|
||||||
|
verify(!!controlUnderTest)
|
||||||
|
controlUnderTest.buttonText = "Add assets"
|
||||||
|
controlUnderTest.errorDetails = "Added some details here"
|
||||||
|
|
||||||
|
const errorTitle = findChild(controlUnderTest, "errorTitle")
|
||||||
|
verify(!!errorTitle)
|
||||||
|
const button = findChild(controlUnderTest, "addBalanceButton")
|
||||||
|
verify(!!button)
|
||||||
|
const expandButton = findChild(controlUnderTest, "expandButton")
|
||||||
|
verify(!!expandButton)
|
||||||
|
const errorDetails = findChild(controlUnderTest, "errorDetails")
|
||||||
|
verify(!!errorDetails)
|
||||||
|
|
||||||
|
controlUnderTest.expandable = true
|
||||||
|
verify(errorTitle.visible)
|
||||||
|
verify(!button.visible)
|
||||||
|
verify(expandButton.visible)
|
||||||
|
compare(expandButton.text, qsTr("+ Show details"))
|
||||||
|
verify(!errorDetails.visible)
|
||||||
|
|
||||||
|
mouseClick(expandButton)
|
||||||
|
compare(expandButton.text, qsTr("- Hide details"))
|
||||||
|
verify(errorDetails.visible)
|
||||||
|
|
||||||
|
controlUnderTest.expandable = false
|
||||||
|
verify(errorTitle.visible)
|
||||||
|
verify(button.visible)
|
||||||
|
verify(!expandButton.visible)
|
||||||
|
verify(errorDetails.visible)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ Rectangle {
|
||||||
|
|
||||||
property ObjectModel leftButtons
|
property ObjectModel leftButtons
|
||||||
property ObjectModel rightButtons
|
property ObjectModel rightButtons
|
||||||
|
property ObjectModel errorTags
|
||||||
property int spacing: 5
|
property int spacing: 5
|
||||||
property bool dropShadowEnabled
|
property bool dropShadowEnabled
|
||||||
|
|
||||||
|
@ -34,17 +35,41 @@ Rectangle {
|
||||||
visible: !root.dropShadowEnabled
|
visible: !root.dropShadowEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
ColumnLayout {
|
||||||
id: layout
|
id: layout
|
||||||
|
|
||||||
spacing: root.spacing
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
fill: parent
|
fill: parent
|
||||||
margins: 16
|
margins: 16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
Layout.topMargin: 4
|
||||||
|
model: root.errorTags
|
||||||
|
onItemAdded: {
|
||||||
|
item.Layout.fillHeight = true
|
||||||
|
item.Layout.fillWidth = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusDialogDivider {
|
||||||
|
Layout.topMargin: 12
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
color: Theme.palette.directColor8
|
||||||
|
|
||||||
|
visible: !!root.errorTags && root.errorTags.count > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
spacing: root.spacing
|
||||||
|
clip: true
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
model: root.leftButtons
|
model: root.leftButtons
|
||||||
onItemAdded: {
|
onItemAdded: {
|
||||||
|
@ -65,6 +90,7 @@ Rectangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
layer.enabled: root.dropShadowEnabled
|
layer.enabled: root.dropShadowEnabled
|
||||||
layer.effect: DropShadow {
|
layer.effect: DropShadow {
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.15
|
||||||
|
import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
import StatusQ.Components 0.1
|
||||||
|
|
||||||
|
Control {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property alias errorTitle: errorTitle.text
|
||||||
|
property alias buttonText: addBalanceButton.text
|
||||||
|
property alias errorDetails: errorDetails.text
|
||||||
|
property alias icon: errorIcon.icon
|
||||||
|
property bool expandable
|
||||||
|
|
||||||
|
signal buttonClicked()
|
||||||
|
|
||||||
|
padding: Theme.halfPadding
|
||||||
|
leftPadding: 12
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 8
|
||||||
|
color: Theme.palette.dangerColor3
|
||||||
|
border.width: 1
|
||||||
|
border.color: Theme.palette.dangerColor2
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: ColumnLayout {
|
||||||
|
RowLayout {
|
||||||
|
spacing: Theme.halfPadding
|
||||||
|
StatusIcon {
|
||||||
|
id: errorIcon
|
||||||
|
|
||||||
|
objectName: "errorIcon"
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
|
||||||
|
icon: "warning"
|
||||||
|
color: Theme.palette.dangerColor1
|
||||||
|
}
|
||||||
|
StatusBaseText {
|
||||||
|
id: errorTitle
|
||||||
|
|
||||||
|
objectName: "errorTitle"
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
|
||||||
|
color: Theme.palette.dangerColor1
|
||||||
|
font.pixelSize: Theme.additionalTextSize
|
||||||
|
}
|
||||||
|
StatusButton {
|
||||||
|
id: addBalanceButton
|
||||||
|
|
||||||
|
objectName: "addBalanceButton"
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
|
||||||
|
|
||||||
|
size: StatusBaseButton.Size.Small
|
||||||
|
type: StatusBaseButton.Type.Danger
|
||||||
|
normalColor: Theme.palette.dangerColor1
|
||||||
|
hoverColor: Theme.palette.hoverColor(normalColor)
|
||||||
|
textColor: Theme.palette.indirectColor1
|
||||||
|
|
||||||
|
onClicked: root.buttonClicked()
|
||||||
|
|
||||||
|
visible: !root.expandable && !!text
|
||||||
|
}
|
||||||
|
StatusButton {
|
||||||
|
id: expandButton
|
||||||
|
|
||||||
|
objectName: "expandButton"
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
|
||||||
|
|
||||||
|
checkable: true
|
||||||
|
size: StatusBaseButton.Size.Small
|
||||||
|
normalColor: Theme.palette.transparent
|
||||||
|
hoverColor: Theme.palette.transparent
|
||||||
|
textColor: Theme.palette.dangerColor1
|
||||||
|
textHoverColor: Theme.palette.hoverColor(textColor)
|
||||||
|
font.pixelSize: Theme.tertiaryTextFontSize
|
||||||
|
font.weight: Font.Normal
|
||||||
|
text: checked ? qsTr("- Hide details") : qsTr("+ Show details")
|
||||||
|
|
||||||
|
visible: root.expandable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StatusBaseText {
|
||||||
|
id: errorDetails
|
||||||
|
|
||||||
|
objectName: "errorDetails"
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
Layout.leftMargin: errorIcon.width + Theme.halfPadding
|
||||||
|
|
||||||
|
color: Theme.palette.dangerColor1
|
||||||
|
font.pixelSize: Theme.additionalTextSize
|
||||||
|
elide: Text.ElideRight
|
||||||
|
|
||||||
|
visible: root.expandable ? expandButton.checked : !!text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,3 +26,4 @@ SwapProvidersTermsAndConditionsText 1.0 SwapProvidersTermsAndConditionsText.qml
|
||||||
TokenSelector 1.0 TokenSelector.qml
|
TokenSelector 1.0 TokenSelector.qml
|
||||||
TokenSelectorButton 1.0 TokenSelectorButton.qml
|
TokenSelectorButton 1.0 TokenSelectorButton.qml
|
||||||
TokenSelectorCompactButton 1.0 TokenSelectorCompactButton.qml
|
TokenSelectorCompactButton 1.0 TokenSelectorCompactButton.qml
|
||||||
|
RouterErrorTag 1.0 RouterErrorTag.qml
|
||||||
|
|
|
@ -22,7 +22,6 @@ StatusDialogFooter {
|
||||||
// Signal to propogate Send clicked
|
// Signal to propogate Send clicked
|
||||||
signal reviewSendClicked()
|
signal reviewSendClicked()
|
||||||
|
|
||||||
implicitHeight: 82
|
|
||||||
spacing: Theme.bigPadding
|
spacing: Theme.bigPadding
|
||||||
color: Theme.palette.baseColor3
|
color: Theme.palette.baseColor3
|
||||||
dropShadowEnabled: true
|
dropShadowEnabled: true
|
||||||
|
|
Loading…
Reference in New Issue