feat(JoinCommunity): Created join permission overlay panel
Created needed components to display permission requirements to join a community. Part of #9267
This commit is contained in:
parent
842c90a31e
commit
ec8b03be6e
|
@ -0,0 +1,96 @@
|
||||||
|
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 StatusQ.Components 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
|
||||||
|
import AppLayouts.Chat.helpers 1.0
|
||||||
|
import AppLayouts.Chat.controls.community 1.0
|
||||||
|
|
||||||
|
import SortFilterProxyModel 0.2
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
Control {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property var model
|
||||||
|
property string introText
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: d
|
||||||
|
|
||||||
|
// By design values:
|
||||||
|
readonly property int defaultHoldingsSpacing: 8
|
||||||
|
|
||||||
|
function holdingsTextFormat(name, amount) {
|
||||||
|
return CommunityPermissionsHelpers.setHoldingsTextFormat(HoldingTypes.Type.Asset, name, amount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: ColumnLayout {
|
||||||
|
spacing: root.spacing
|
||||||
|
|
||||||
|
StatusBaseText {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
text: root.introText
|
||||||
|
textFormat: Text.StyledText
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
spacing: d.defaultHoldingsSpacing
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: root.model
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
spacing: d.defaultHoldingsSpacing
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: 18 // by design
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: SortFilterProxyModel {
|
||||||
|
sourceModel: holdingsListModel
|
||||||
|
proxyRoles: ExpressionRole {
|
||||||
|
name: "text"
|
||||||
|
// Direct call for singleton function is not handled properly by SortFilterProxyModel that's why `holdingsTextFormat` is used instead.
|
||||||
|
expression: d.holdingsTextFormat(model.name, model.amount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusListItemTag {
|
||||||
|
enabled: false
|
||||||
|
leftPadding: 2
|
||||||
|
title: text
|
||||||
|
asset.name: model.imageSource
|
||||||
|
asset.isImage: true
|
||||||
|
asset.bgColor: "transparent"
|
||||||
|
asset.height: 28
|
||||||
|
asset.width: asset.height
|
||||||
|
closeButtonVisible: false
|
||||||
|
titleText.color: model.available ? Theme.palette.primaryColor1 : Theme.palette.dangerColor1
|
||||||
|
bgColor: model.available ? Theme.palette.primaryColor2 :Theme.palette.dangerColor2
|
||||||
|
titleText.font.pixelSize: 15
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusBaseText {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
text: qsTr("or")
|
||||||
|
textFormat: Text.StyledText
|
||||||
|
visible: (index !== root.model.count - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
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 StatusQ.Components 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
|
||||||
|
import AppLayouts.Chat.helpers 1.0
|
||||||
|
import AppLayouts.Chat.controls.community 1.0
|
||||||
|
|
||||||
|
import SortFilterProxyModel 0.2
|
||||||
|
|
||||||
|
|
||||||
|
Control {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property bool joinCommunity: true // Otherwise it means join channel action
|
||||||
|
property bool requirementsMet: false
|
||||||
|
property bool requiresRequest: false
|
||||||
|
property bool isInvitationPending: false
|
||||||
|
property bool isJoinRequestRejected: false
|
||||||
|
property string communityName
|
||||||
|
property var communityHoldings
|
||||||
|
property string channelName
|
||||||
|
property var viewOnlyHoldings
|
||||||
|
property var viewAndPostHoldings
|
||||||
|
property var moderateHoldings
|
||||||
|
|
||||||
|
signal revealAddressClicked
|
||||||
|
signal invitationPendingClicked
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: d
|
||||||
|
|
||||||
|
readonly property string communityRequirementsNotMetText: qsTr("Membership requirements not met")
|
||||||
|
readonly property string communityRevealAddressText: qsTr("Reveal your address to join")
|
||||||
|
readonly property string communityRevealAddressWithRequestText: qsTr("Reveal your address and request to join")
|
||||||
|
readonly property string communityMembershipRequestPendingText: qsTr("Membership Request Pending...")
|
||||||
|
readonly property string channelRequirementsNotMetText: qsTr("Channel requirements not met")
|
||||||
|
readonly property string channelRevealAddressText: qsTr("Reveal your address to enter")
|
||||||
|
readonly property string channelMembershipRequestPendingText: qsTr("Channel Membership Request Pending...")
|
||||||
|
readonly property string memberchipRequestRejectedText: qsTr("Membership Request Rejected")
|
||||||
|
|
||||||
|
function holdingsTextFormat(name, amount) {
|
||||||
|
return CommunityPermissionsHelpers.setHoldingsTextFormat(HoldingTypes.Type.Asset, name, amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getInvitationPendingText() {
|
||||||
|
return root.joinCommunity ? d.communityMembershipRequestPendingText : d.channelMembershipRequestPendingText
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRevealAddressText() {
|
||||||
|
return root.joinCommunity ? (root.requiresRequest ? d.communityRevealAddressWithRequestText : d.communityRevealAddressText) : d.channelRevealAddressText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
padding: 35 // default by design
|
||||||
|
spacing: 32 // default by design
|
||||||
|
contentItem: ColumnLayout {
|
||||||
|
id: column
|
||||||
|
spacing: root.spacing
|
||||||
|
|
||||||
|
HoldingsListPanel {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: root.spacing
|
||||||
|
visible: root.joinCommunity && root.communityHoldings
|
||||||
|
introText: qsTr("To join <b>%1</b> you need to prove that you hold").arg(root.communityName)
|
||||||
|
model: root.communityHoldings
|
||||||
|
}
|
||||||
|
|
||||||
|
HoldingsListPanel {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: root.spacing
|
||||||
|
visible: !root.joinCommunity && !!root.viewOnlyHoldings
|
||||||
|
introText: qsTr("To only view the <b>%1</b> channel you need to hold").arg(root.channelName)
|
||||||
|
model: root.viewOnlyHoldings
|
||||||
|
}
|
||||||
|
|
||||||
|
HoldingsListPanel {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: root.spacing
|
||||||
|
visible: !root.joinCommunity && !!root.viewAndPostHoldings
|
||||||
|
introText: qsTr("To view and post in the <b>%1</b> channel you need to hold").arg(root.channelName)
|
||||||
|
model: root.viewAndPostHoldings
|
||||||
|
}
|
||||||
|
|
||||||
|
HoldingsListPanel {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: root.spacing
|
||||||
|
visible: !root.joinCommunity && !!root.moderateHoldings
|
||||||
|
introText: qsTr("To moderate in the <b>%1</b> channel you need to hold").arg(root.channelName)
|
||||||
|
model: root.moderateHoldings
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusButton {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
visible: !root.isJoinRequestRejected
|
||||||
|
text: root.isInvitationPending ? d.getInvitationPendingText() : d.getRevealAddressText()
|
||||||
|
font.pixelSize: 13
|
||||||
|
enabled: root.requirementsMet
|
||||||
|
onClicked: root.isInvitationPending ? root.invitationPendingClicked() : root.revealAddressClicked()
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusBaseText {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
visible: root.isJoinRequestRejected || !root.requirementsMet
|
||||||
|
text: root.isJoinRequestRejected ? d.memberchipRequestRejectedText :
|
||||||
|
(root.joinCommunity ? d.communityRequirementsNotMetText : d.channelRequirementsNotMetText)
|
||||||
|
color: Theme.palette.dangerColor1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,3 +4,4 @@ CommunityProfilePopupInviteMessagePanel 1.0 CommunityProfilePopupInviteMessagePa
|
||||||
PermissionQualificationPanel 1.0 PermissionQualificationPanel.qml
|
PermissionQualificationPanel 1.0 PermissionQualificationPanel.qml
|
||||||
PermissionConflictWarningPanel 1.0 PermissionConflictWarningPanel.qml
|
PermissionConflictWarningPanel 1.0 PermissionConflictWarningPanel.qml
|
||||||
CommunityColumnHeaderPanel 1.0 CommunityColumnHeaderPanel.qml
|
CommunityColumnHeaderPanel 1.0 CommunityColumnHeaderPanel.qml
|
||||||
|
JoinPermissionsOverlayPanel 1.0 JoinPermissionsOverlayPanel.qml
|
||||||
|
|
Loading…
Reference in New Issue