feat(MintTokens): Created `BurnTokensPopup`

- Created new popup.
- Added validation.
- Added header image component.
This commit is contained in:
Noelia 2023-05-18 18:08:30 +02:00 committed by Noelia
parent 243728b769
commit a366e96999
3 changed files with 179 additions and 0 deletions

View File

@ -0,0 +1,177 @@
import QtQuick 2.15
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import QtQml.Models 2.14
import QtGraphicalEffects 1.0
import StatusQ.Core 0.1
import StatusQ.Controls 0.1
import StatusQ.Popups.Dialog 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Core.Utils 0.1
import StatusQ.Controls.Validators 0.1
import StatusQ.Components 0.1
import AppLayouts.Chat.panels.communities 1.0
import utils 1.0
StatusDialog {
id: root
property string communityName
property string tokenName
property int remainingTokens
property url tokenSource
property bool isAsset // If asset isAsset = true; if collectible --> isAsset = false
signal burnClicked(int burnAmount)
signal cancelClicked
QtObject {
id: d
property alias amountToBurn: amountToBurnInput.text
function initialize() {
specificAmountButton.checked = true
amountToBurnInput.forceActiveFocus()
}
function getVerticalPadding() {
return root.topPadding + root.bottomPadding
}
function getHorizontalPadding() {
return root.leftPadding + root.rightPadding
}
}
implicitWidth: 600 // by design
implicitHeight: content.implicitHeight + footer.height + header.height + d.getVerticalPadding()
contentItem: ColumnLayout {
id: content
spacing: Style.current.padding
StatusBaseText {
Layout.fillWidth: true
text: qsTr("How many of %1s remaining %n %2 tokens would you like to burn?", "", root.remainingTokens).arg(root.communityName).arg(root.tokenName)
wrapMode: Text.WordWrap
lineHeight: 1.2
font.pixelSize: Style.current.primaryTextFontSize
}
RowLayout {
Layout.bottomMargin: 12
Layout.leftMargin: -Style.current.halfPadding
spacing: 26
ColumnLayout {
StatusRadioButton {
id: specificAmountButton
text: qsTr("Specific amount")
font.pixelSize: Style.current.primaryTextFontSize
ButtonGroup.group: radioGroup
onToggled: if(checked) amountToBurnInput.forceActiveFocus()
}
StatusInput {
id: amountToBurnInput
Layout.preferredWidth: 192
Layout.leftMargin: 30
enabled: specificAmountButton.checked
validationMode: StatusInput.ValidationMode.OnlyWhenDirty
validators: [
StatusValidator {
validate: (value) => { return (parseInt(value) > 0 && parseInt(value) <= root.remainingTokens) }
errorMessage: qsTr("Exceeds available remaining")
},
StatusValidator {
validate: (value) => { return parseInt(value) !== 0 }
errorMessage: qsTr("Amount must be greater than 0")
},
StatusRegularExpressionValidator {
regularExpression: Constants.regularExpressions.numerical
errorMessage: qsTr("Invalid characters (0-9 only)")
}
]
}
}
StatusRadioButton {
id: allTokensButton
Layout.alignment: Qt.AlignTop
text: qsTr("All available remaining (%1)").arg(root.remainingTokens)
font.pixelSize: Style.current.primaryTextFontSize
ButtonGroup.group: radioGroup
}
ButtonGroup { id: radioGroup }
}
}
header: StatusDialogHeader {
headline.title: qsTr("Burn %1 tokens").arg(root.tokenName)
headline.subtitle: qsTr("%n %1 remaining in smart contract", "", root.remainingTokens).arg(root.tokenName)
leftComponent: Rectangle {
height: 40
width: height
radius: root.isAsset ? height/2 : 8
color:Theme.palette.baseColor2
Image {
id: image
source: root.tokenSource
anchors.fill: parent
fillMode: Image.PreserveAspectFit
visible: false
}
OpacityMask {
anchors.fill: image
source: image
maskSource: parent
}
}
actions.closeButton.onClicked: root.close()
}
footer: StatusDialogFooter {
spacing: Style.current.padding
rightButtons: ObjectModel {
StatusButton {
text: qsTr("Cancel")
normalColor: "transparent"
onClicked: {
root.cancelClicked()
close()
}
}
StatusButton {
enabled: specificAmountButton.checked && amountToBurnInput.valid || allTokensButton.checked
text: qsTr("Burn tokens")
type: StatusBaseButton.Type.Danger
onClicked: {
if(specificAmountButton.checked)
root.burnClicked(parseInt(amountToBurnInput.text))
else
root.burnClicked(root.remainingTokens)
}
}
}
}
onOpened: d.initialize()
}

View File

@ -1,3 +1,4 @@
BurnTokensPopup 1.0 BurnTokensPopup.qml
CreateChannelPopup 1.0 CreateChannelPopup.qml
CommunityTokenPermissionsPopup 1.0 CommunityTokenPermissionsPopup.qml
RemotelyDestructPopup 1.0 RemotelyDestructPopup.qml

View File

@ -596,6 +596,7 @@ QtObject {
readonly property var alphanumericalExpanded: /^$|^[a-zA-Z0-9\-_ ]+$/
readonly property var asciiPrintable: /^$|^[!-~]+$/
readonly property var ascii: /^$|^[\x00-\x7F]+$/
readonly property var numerical: /^\d+$/
}
readonly property QtObject errorMessages: QtObject {