diff --git a/storybook/pages/KickBanPopupPage.qml b/storybook/pages/KickBanPopupPage.qml
new file mode 100644
index 0000000000..61a57fea61
--- /dev/null
+++ b/storybook/pages/KickBanPopupPage.qml
@@ -0,0 +1,111 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+
+import Storybook 1.0
+
+import AppLayouts.Communities.popups 1.0
+
+
+SplitView {
+ Logs { id: logs }
+
+ orientation: Qt.Vertical
+ SplitView.fillWidth: true
+
+ Item {
+ SplitView.fillWidth: true
+ SplitView.fillHeight: true
+
+ PopupBackground {
+ anchors.fill: parent
+ }
+
+ Button {
+ anchors.centerIn: parent
+ text: "Reopen"
+
+ onClicked: dialog.open()
+ }
+
+ KickBanPopup {
+ id: dialog
+
+ mode: modesButtonGroup.checkedButton.mode
+ username: usernameTextField.text
+ communityName: communityNameTextField.text
+
+ closePolicy: Popup.NoAutoClose
+ visible: true
+ modal: false
+ destroyOnClose: false
+ anchors.centerIn: parent
+
+ onAccepted: logs.logEvent("KickBanPopup::accepted")
+ }
+ }
+
+ LogsAndControlsPanel {
+ id: logsAndControlsPanel
+
+ SplitView.minimumHeight: 100
+ SplitView.preferredHeight: 250
+
+ logsView.logText: logs.logText
+
+ ColumnLayout {
+ ButtonGroup {
+ id: modesButtonGroup
+
+ buttons: modesRow.children
+ }
+
+ RowLayout {
+ id: modesRow
+
+ RadioButton {
+ readonly property int mode: KickBanPopup.Mode.Kick
+
+ text: "Kick"
+ checked: true
+ }
+
+ RadioButton {
+ readonly property int mode: KickBanPopup.Mode.Ban
+
+ text: "Ban"
+ }
+ }
+
+ MenuSeparator {
+ Layout.fillWidth: true
+ }
+
+ RowLayout {
+ Label {
+ text: "Username:"
+ }
+
+ TextField {
+ id: usernameTextField
+
+ text: "John"
+ }
+ }
+
+ RowLayout {
+ Label {
+ text: "Community:"
+ }
+
+ TextField {
+ id: communityNameTextField
+
+ text: "CryptoKitties"
+ }
+ }
+ }
+ }
+}
+
+// category: Popups
diff --git a/ui/app/AppLayouts/Communities/panels/MembersSettingsPanel.qml b/ui/app/AppLayouts/Communities/panels/MembersSettingsPanel.qml
index 9befc34956..a56c261601 100644
--- a/ui/app/AppLayouts/Communities/panels/MembersSettingsPanel.qml
+++ b/ui/app/AppLayouts/Communities/panels/MembersSettingsPanel.qml
@@ -1,17 +1,11 @@
import QtQuick 2.15
import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
-import StatusQ.Core 0.1
-import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
-import StatusQ.Components 0.1
-import StatusQ.Popups 0.1
-
import utils 1.0
-import shared.controls.chat 1.0
import AppLayouts.Communities.layouts 1.0
+import AppLayouts.Communities.popups 1.0
SettingsPage {
id: root
@@ -121,15 +115,17 @@ SettingsPage {
Layout.fillHeight: true
onKickUserClicked: {
- kickModal.userNameToKick = name
- kickModal.userIdToKick = id
- kickModal.open()
+ kickBanPopup.mode = KickBanPopup.Mode.Kick
+ kickBanPopup.username = name
+ kickBanPopup.userId = id
+ kickBanPopup.open()
}
onBanUserClicked: {
- banModal.userNameToBan = name
- banModal.userIdToBan = id
- banModal.open()
+ kickBanPopup.mode = KickBanPopup.Mode.Ban
+ kickBanPopup.username = name
+ kickBanPopup.userId = id
+ kickBanPopup.open()
}
}
@@ -190,85 +186,18 @@ SettingsPage {
}
}
- StatusModal {
- id: banModal
+ KickBanPopup {
+ id: kickBanPopup
- property string userNameToBan: ""
- property string userIdToBan: ""
+ property string userId
- readonly property string text: qsTr("Are you sure you ban %1 from %2?").arg(userNameToBan).arg(root.communityName)
+ communityName: root.communityName
- anchors.centerIn: parent
- width: 400
- headerSettings.title: qsTr("Ban %1").arg(userNameToBan)
-
- contentItem: StatusBaseText {
- id: banContentText
- anchors.centerIn: parent
- font.pixelSize: 15
- color: Theme.palette.directColor1
- padding: 15
- wrapMode: Text.WordWrap
- text: banModal.text
+ onAccepted: {
+ if (mode === KickBanPopup.Mode.Kick)
+ root.kickUserClicked(userId)
+ else
+ root.banUserClicked(userId)
}
-
- rightButtons: [
- StatusButton {
- text: qsTr("Cancel")
- onClicked: banModal.close()
- normalColor: "transparent"
- hoverColor: "transparent"
- },
- StatusButton {
- id: banButton
- text: qsTr("Ban")
- type: StatusBaseButton.Type.Danger
- onClicked: {
- root.banUserClicked(banModal.userIdToBan)
- banModal.close()
- }
- }
- ]
- }
-
- StatusModal {
- id: kickModal
-
- property string userNameToKick: ""
- property string userIdToKick: ""
-
- readonly property string text : qsTr("Are you sure you kick %1 from %2?").arg(userNameToKick).arg(communityName)
-
- anchors.centerIn: parent
- width: 400
- headerSettings.title: qsTr("Kick %1").arg(userNameToKick)
-
- contentItem: StatusBaseText {
- id: kickContentText
- anchors.centerIn: parent
- font.pixelSize: 15
- color: Theme.palette.directColor1
- padding: 15
- wrapMode: Text.WordWrap
- text: kickModal.text
- }
-
- rightButtons: [
- StatusButton {
- text: qsTr("Cancel")
- onClicked: kickModal.close()
- normalColor: "transparent"
- hoverColor: "transparent"
- },
- StatusButton {
- objectName: "CommunityMembers_KickModal_KickButton"
- text: qsTr("Kick")
- type: StatusBaseButton.Type.Danger
- onClicked: {
- root.kickUserClicked(kickModal.userIdToKick)
- kickModal.close()
- }
- }
- ]
}
}
diff --git a/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml b/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml
index 953031ee77..8c7a597637 100644
--- a/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml
+++ b/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml
@@ -65,6 +65,9 @@ StackView {
signal mintAsset(var assetItem)
signal mintOwnerToken(var ownerToken, var tMasterToken)
+ signal kickUserRequested(string contactId)
+ signal banUserRequested(string contactId)
+
signal deployFeesRequested(int chainId, string accountAddress, int tokenType)
signal burnFeesRequested(string tokenKey, string amount, string accountAddress)
signal remotelyDestructFeesRequest(var walletsAndAmounts, // { [walletAddress (string), amount (int)] }
@@ -551,13 +554,19 @@ StackView {
}
onBanRequested: {
- tokenMasterActionPopup.openPopup(
- TokenMasterActionPopup.ActionType.Ban, name)
+ if (token.isPrivilegedToken)
+ tokenMasterActionPopup.openPopup(
+ TokenMasterActionPopup.ActionType.Ban, name)
+ else
+ kickBanPopup.openPopup(KickBanPopup.Mode.Ban, name, contactId)
}
onKickRequested: {
- tokenMasterActionPopup.openPopup(
- TokenMasterActionPopup.ActionType.Kick, name)
+ if (token.isPrivilegedToken)
+ tokenMasterActionPopup.openPopup(
+ TokenMasterActionPopup.ActionType.Kick, name)
+ else
+ kickBanPopup.openPopup(KickBanPopup.Mode.Kick, name, contactId)
}
TokenMasterActionPopup {
@@ -574,6 +583,28 @@ StackView {
open()
}
}
+
+ KickBanPopup {
+ id: kickBanPopup
+
+ property string contactId
+
+ communityName: root.communityName
+
+ onAccepted: {
+ if (mode === KickBanPopup.Mode.Kick)
+ root.kickUserRequested(contactId)
+ else
+ root.banUserRequested(contactId)
+ }
+
+ function openPopup(mode, userName, contactId) {
+ kickBanPopup.mode = mode
+ kickBanPopup.username = userName
+ kickBanPopup.contactId = contactId
+ open()
+ }
+ }
}
footer: MintTokensFooterPanel {
diff --git a/ui/app/AppLayouts/Communities/panels/SortableTokenHoldersPanel.qml b/ui/app/AppLayouts/Communities/panels/SortableTokenHoldersPanel.qml
index db3505568c..dcd079367b 100644
--- a/ui/app/AppLayouts/Communities/panels/SortableTokenHoldersPanel.qml
+++ b/ui/app/AppLayouts/Communities/panels/SortableTokenHoldersPanel.qml
@@ -31,8 +31,8 @@ Control {
signal viewMessagesRequested(string contactId)
signal airdropRequested(string address)
signal remoteDestructRequested(string name, string address)
- signal kickRequested(string name, string address)
- signal banRequested(string name, string address)
+ signal kickRequested(string name, string contactId)
+ signal banRequested(string name, string contactId)
signal generalAirdropRequested
@@ -202,8 +202,7 @@ Control {
enabled: !menu.rawAddress
type: StatusBaseButton.Type.Danger
- onTriggered: root.kickRequested(menu.name,
- menu.currentAddress)
+ onTriggered: root.kickRequested(menu.name, menu.contactId)
}
StatusAction {
@@ -214,8 +213,7 @@ Control {
enabled: !menu.rawAddress
type: StatusBaseButton.Type.Danger
- onTriggered: root.banRequested(menu.name,
- menu.currentAddress)
+ onTriggered: root.banRequested(menu.name, menu.contactId)
}
}
}
diff --git a/ui/app/AppLayouts/Communities/popups/KickBanPopup.qml b/ui/app/AppLayouts/Communities/popups/KickBanPopup.qml
new file mode 100644
index 0000000000..8c9ef88726
--- /dev/null
+++ b/ui/app/AppLayouts/Communities/popups/KickBanPopup.qml
@@ -0,0 +1,64 @@
+import QtQuick 2.15
+import QtQml.Models 2.15
+
+import StatusQ.Controls 0.1
+import StatusQ.Core 0.1
+import StatusQ.Popups.Dialog 0.1
+
+import utils 1.0
+
+
+StatusDialog {
+ id: root
+
+ property string username: ""
+ property string communityName: ""
+ property int mode: KickBanPopup.Mode.Kick
+
+ enum Mode {
+ Kick, Ban
+ }
+
+ width: 400
+
+ title: root.mode === KickBanPopup.Mode.Kick
+ ? qsTr("Kick %1").arg(root.username)
+ : qsTr("Ban %1").arg(root.username)
+
+ contentItem: StatusBaseText {
+ anchors.centerIn: parent
+ font.pixelSize: Style.current.primaryTextFontSize
+ wrapMode: Text.Wrap
+
+ text: root.mode === KickBanPopup.Mode.Kick
+ ? qsTr("Are you sure you kick %1 from %2?")
+ .arg(root.username).arg(root.communityName)
+ : qsTr("Are you sure you ban %1 from %2?")
+ .arg(root.username).arg(root.communityName)
+ }
+
+ footer: StatusDialogFooter {
+ rightButtons: ObjectModel {
+ StatusFlatButton {
+ text: qsTr("Cancel")
+
+ onClicked: root.close()
+ }
+ StatusButton {
+ id: banButton
+
+ objectName: root.mode === KickBanPopup.Mode.Kick
+ ? "CommunityMembers_KickModal_KickButton"
+ : "CommunityMembers_BanModal_BanButton"
+
+ text: root.mode === KickBanPopup.Mode.Kick ? qsTr("Kick")
+ : qsTr("Ban")
+ type: StatusBaseButton.Type.Danger
+ onClicked: {
+ root.accept()
+ root.close()
+ }
+ }
+ }
+ }
+}
diff --git a/ui/app/AppLayouts/Communities/popups/qmldir b/ui/app/AppLayouts/Communities/popups/qmldir
index 2e72ad691c..bece5a0276 100644
--- a/ui/app/AppLayouts/Communities/popups/qmldir
+++ b/ui/app/AppLayouts/Communities/popups/qmldir
@@ -10,6 +10,7 @@ HoldingsDropdown 1.0 HoldingsDropdown.qml
ImportControlNodePopup 1.0 ImportControlNodePopup.qml
InDropdown 1.0 InDropdown.qml
InviteFriendsToCommunityPopup 1.0 InviteFriendsToCommunityPopup.qml
+KickBanPopup 1.0 KickBanPopup.qml
MembersDropdown 1.0 MembersDropdown.qml
PermissionsDropdown 1.0 PermissionsDropdown.qml
RecipientTypeSelectionDropdown 1.0 RecipientTypeSelectionDropdown.qml
diff --git a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml
index c69f6d1f6d..adaa97e240 100644
--- a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml
+++ b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml
@@ -410,6 +410,9 @@ StatusSectionLayout {
// Set given addresses as recipients
airdropPanel.addAddresses(addresses)
}
+
+ onKickUserRequested: root.rootStore.removeUserFromCommunity(contactId)
+ onBanUserRequested: root.rootStore.banUserFromCommunity(contactId)
}
AirdropsSettingsPanel {
diff --git a/ui/app/AppLayouts/Communities/views/CommunityTokenView.qml b/ui/app/AppLayouts/Communities/views/CommunityTokenView.qml
index cd0d716a2f..56c3fe89f4 100644
--- a/ui/app/AppLayouts/Communities/views/CommunityTokenView.qml
+++ b/ui/app/AppLayouts/Communities/views/CommunityTokenView.qml
@@ -71,8 +71,8 @@ StatusScrollView {
signal viewMessagesRequested(string contactId)
signal remoteDestructRequested(string name, string address)
- signal kickRequested(string name, string address)
- signal banRequested(string name, string address)
+ signal kickRequested(string name, string contactId)
+ signal banRequested(string name, string contactId)
signal deployFeesRequested
@@ -217,8 +217,8 @@ StatusScrollView {
onGeneralAirdropRequested: root.generalAirdropRequested()
onRemoteDestructRequested: root.remoteDestructRequested(name, address)
- onKickRequested: root.kickRequested(name, address)
- onBanRequested: root.banRequested(name, address)
+ onKickRequested: root.kickRequested(name, contactId)
+ onBanRequested: root.banRequested(name, contactId)
}
}
}