fix(JoinCommunity): Add missing state ONLY private permissions and NOT MET (#14164)
* fix(JoinCommunity): Add missing state ONLY private permissions and NOT MET - Modified `becomeMemberModel` in store to provide all member permissions. - Modified permissions model filter to only discard permissions that are private and NOT met. - Updated `storybook/PermissionsModel` with new only private permissions and added new model option in corresponding pages. Closes #14104 * fix(JoinCommunity): Text position when all channels hidden Updated text position when `allChannelsAreHiddenBecauseNotPermitted` in community join process
This commit is contained in:
parent
7804d4ca39
commit
4144e374a6
|
@ -125,6 +125,16 @@ ColumnLayout {
|
||||||
text: "Long model"
|
text: "Long model"
|
||||||
onCheckedChanged: if(checked) root.communityHoldingsModel = PermissionsModel.longPermissionsModel
|
onCheckedChanged: if(checked) root.communityHoldingsModel = PermissionsModel.longPermissionsModel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RadioButton {
|
||||||
|
text: "Private met model"
|
||||||
|
onCheckedChanged: if(checked) root.communityHoldingsModel = PermissionsModel.privatePermissionsModel
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioButton {
|
||||||
|
text: "Private not met model"
|
||||||
|
onCheckedChanged: if(checked) root.communityHoldingsModel = PermissionsModel.privatePermissionsNotMetModel
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
|
|
|
@ -47,13 +47,52 @@ QtObject {
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
readonly property var shortPermissionsModelData: [
|
readonly property var privatePermissionsModelData: [
|
||||||
{
|
{
|
||||||
holdingsListModel: root.createHoldingsModel4(),
|
holdingsListModel: root.createHoldingsModel1(),
|
||||||
channelsListModel: root.createChannelsModel1(),
|
channelsListModel: root.createChannelsModel1(),
|
||||||
permissionType: PermissionTypes.Type.Admin,
|
permissionType: PermissionTypes.Type.Admin,
|
||||||
permissionState: PermissionTypes.State.Approved,
|
permissionState: PermissionTypes.State.Approved,
|
||||||
isPrivate: true
|
isPrivate: true,
|
||||||
|
tokenCriteriaMet: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
holdingsListModel: root.createHoldingsModel2(),
|
||||||
|
channelsListModel: root.createChannelsModel2(),
|
||||||
|
permissionType: PermissionTypes.Type.Admin,
|
||||||
|
permissionState: PermissionTypes.State.Approved,
|
||||||
|
isPrivate: true,
|
||||||
|
tokenCriteriaMet: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
readonly property var privatePermissionsModelNotMetData: [
|
||||||
|
{
|
||||||
|
holdingsListModel: root.createHoldingsModel1(),
|
||||||
|
channelsListModel: root.createChannelsModel1(),
|
||||||
|
permissionType: PermissionTypes.Type.Admin,
|
||||||
|
permissionState: PermissionTypes.State.Approved,
|
||||||
|
isPrivate: true,
|
||||||
|
tokenCriteriaMet: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
holdingsListModel: root.createHoldingsModel2(),
|
||||||
|
channelsListModel: root.createChannelsModel2(),
|
||||||
|
permissionType: PermissionTypes.Type.Admin,
|
||||||
|
permissionState: PermissionTypes.State.Approved,
|
||||||
|
isPrivate: true,
|
||||||
|
tokenCriteriaMet: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
readonly property var shortPermissionsModelData: [
|
||||||
|
{
|
||||||
|
holdingsListModel: root.createHoldingsModel1(),
|
||||||
|
channelsListModel: root.createChannelsModel2(),
|
||||||
|
permissionType: PermissionTypes.Type.Member,
|
||||||
|
permissionState: PermissionTypes.State.Approved,
|
||||||
|
isPrivate: false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -69,13 +108,6 @@ QtObject {
|
||||||
]
|
]
|
||||||
|
|
||||||
readonly property var longPermissionsModelData: [
|
readonly property var longPermissionsModelData: [
|
||||||
{
|
|
||||||
holdingsListModel: root.createHoldingsModel4(),
|
|
||||||
channelsListModel: root.createChannelsModel1(),
|
|
||||||
permissionType: PermissionTypes.Type.Admin,
|
|
||||||
permissionState: PermissionTypes.State.Approved,
|
|
||||||
isPrivate: true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
holdingsListModel: root.createHoldingsModel3(),
|
holdingsListModel: root.createHoldingsModel3(),
|
||||||
channelsListModel: root.createChannelsModel2(),
|
channelsListModel: root.createChannelsModel2(),
|
||||||
|
@ -460,6 +492,28 @@ QtObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readonly property ListModel privatePermissionsModel: ListModel {
|
||||||
|
readonly property ModelChangeGuard guard: ModelChangeGuard {
|
||||||
|
model: root.privatePermissionsModel
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
append(privatePermissionsModelData)
|
||||||
|
guard.enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property ListModel privatePermissionsNotMetModel: ListModel {
|
||||||
|
readonly property ModelChangeGuard guard: ModelChangeGuard {
|
||||||
|
model: root.privatePermissionsNotMetModel
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
append(privatePermissionsModelNotMetData)
|
||||||
|
guard.enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
readonly property var shortPermissionsModel: ListModel {
|
readonly property var shortPermissionsModel: ListModel {
|
||||||
readonly property ModelChangeGuard guard: ModelChangeGuard {
|
readonly property ModelChangeGuard guard: ModelChangeGuard {
|
||||||
model: root.shortPermissionsModel
|
model: root.shortPermissionsModel
|
||||||
|
@ -663,12 +717,6 @@ QtObject {
|
||||||
|
|
||||||
function createHoldingsModel3() {
|
function createHoldingsModel3() {
|
||||||
return [
|
return [
|
||||||
{
|
|
||||||
type: Constants.TokenType.ERC20,
|
|
||||||
key: "eth",
|
|
||||||
amount: 15,
|
|
||||||
available: true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
type: Constants.TokenType.ERC721,
|
type: Constants.TokenType.ERC721,
|
||||||
key: "Kitty4",
|
key: "Kitty4",
|
||||||
|
|
|
@ -157,8 +157,8 @@ StatusSectionLayout {
|
||||||
|
|
||||||
centerPanel: Loader {
|
centerPanel: Loader {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
sourceComponent: root.allChannelsAreHiddenBecauseNotPermitted ? allChatsAreHiddenComponent :
|
sourceComponent: (root.allChannelsAreHiddenBecauseNotPermitted || root.contentLocked) ?
|
||||||
(root.contentLocked ? joinCommunityCenterPanelComponent : chatColumnViewComponent)
|
joinCommunityCenterPanelComponent : chatColumnViewComponent
|
||||||
}
|
}
|
||||||
|
|
||||||
showRightPanel: {
|
showRightPanel: {
|
||||||
|
@ -251,6 +251,7 @@ StatusSectionLayout {
|
||||||
|
|
||||||
JoinCommunityCenterPanel {
|
JoinCommunityCenterPanel {
|
||||||
joinCommunity: false
|
joinCommunity: false
|
||||||
|
allChannelsAreHiddenBecauseNotPermitted: root.allChannelsAreHiddenBecauseNotPermitted
|
||||||
name: sectionItemModel.name
|
name: sectionItemModel.name
|
||||||
channelName: root.chatContentModule.chatDetails.name
|
channelName: root.chatContentModule.chatDetails.name
|
||||||
viewOnlyHoldingsModel: root.viewOnlyPermissionsModel
|
viewOnlyHoldingsModel: root.viewOnlyPermissionsModel
|
||||||
|
@ -267,18 +268,6 @@ StatusSectionLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
|
||||||
id: allChatsAreHiddenComponent
|
|
||||||
|
|
||||||
StatusBaseText {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
visible: root.allChannelsAreHiddenBecauseNotPermitted
|
|
||||||
text: qsTr("Sorry, you don't hodl the necessary tokens to view or post in any of <b>%1</b> channels").arg(sectionItemModel.name)
|
|
||||||
color: Theme.palette.dangerColor1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
id: contactsColumnComponent
|
id: contactsColumnComponent
|
||||||
ContactsColumnView {
|
ContactsColumnView {
|
||||||
|
|
|
@ -12,6 +12,7 @@ ColumnLayout {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property bool joinCommunity: true // Otherwise it means join channel action
|
property bool joinCommunity: true // Otherwise it means join channel action
|
||||||
|
property bool allChannelsAreHiddenBecauseNotPermitted: false
|
||||||
|
|
||||||
property string name
|
property string name
|
||||||
property string channelName
|
property string channelName
|
||||||
|
@ -139,6 +140,7 @@ ColumnLayout {
|
||||||
|
|
||||||
topPadding: 2 * bottomPadding
|
topPadding: 2 * bottomPadding
|
||||||
joinCommunity: root.joinCommunity
|
joinCommunity: root.joinCommunity
|
||||||
|
allChannelsAreHiddenBecauseNotPermitted: root.allChannelsAreHiddenBecauseNotPermitted
|
||||||
requirementsMet: root.requirementsMet
|
requirementsMet: root.requirementsMet
|
||||||
requirementsCheckPending: root.requirementsCheckPending
|
requirementsCheckPending: root.requirementsCheckPending
|
||||||
isInvitationPending: root.isInvitationPending
|
isInvitationPending: root.isInvitationPending
|
||||||
|
|
|
@ -2,6 +2,7 @@ import QtQuick 2.14
|
||||||
import QtQuick.Controls 2.14
|
import QtQuick.Controls 2.14
|
||||||
import QtQuick.Layouts 1.14
|
import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
|
import StatusQ 0.1
|
||||||
import StatusQ.Core 0.1
|
import StatusQ.Core 0.1
|
||||||
import StatusQ.Core.Theme 0.1
|
import StatusQ.Core.Theme 0.1
|
||||||
import StatusQ.Components 0.1
|
import StatusQ.Components 0.1
|
||||||
|
@ -18,6 +19,7 @@ Control {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property bool joinCommunity: true // Otherwise it means join channel action
|
property bool joinCommunity: true // Otherwise it means join channel action
|
||||||
|
property bool allChannelsAreHiddenBecauseNotPermitted: false
|
||||||
property bool requirementsMet: false
|
property bool requirementsMet: false
|
||||||
property bool requirementsCheckPending: false
|
property bool requirementsCheckPending: false
|
||||||
property bool requiresRequest: false
|
property bool requiresRequest: false
|
||||||
|
@ -46,16 +48,18 @@ Control {
|
||||||
readonly property string channelRequirementsNotMetText: qsTr("Channel requirements not met")
|
readonly property string channelRequirementsNotMetText: qsTr("Channel requirements not met")
|
||||||
readonly property string channelMembershipRequestPendingText: qsTr("Channel Membership Request Pending...")
|
readonly property string channelMembershipRequestPendingText: qsTr("Channel Membership Request Pending...")
|
||||||
readonly property string memberchipRequestRejectedText: qsTr("Membership Request Rejected")
|
readonly property string memberchipRequestRejectedText: qsTr("Membership Request Rejected")
|
||||||
|
readonly property string allChannelsAreHiddenBecauseNotPermittedText: qsTr("Sorry, you don't hodl the necessary tokens to view or post in any of <b>%1</b> channels").arg(root.communityName)
|
||||||
|
|
||||||
function filterPermissions(model) {
|
readonly property bool onlyPrivateNotMetPermissions: (d.visiblePermissionsModel.count === 0) && root.communityHoldingsModel.count > 0
|
||||||
return !!model && (model.tokenCriteriaMet || !model.isPrivate)
|
|
||||||
}
|
|
||||||
|
|
||||||
readonly property var communityPermissionsModel: SortFilterProxyModel {
|
readonly property var visiblePermissionsModel: SortFilterProxyModel {
|
||||||
sourceModel: root.communityHoldingsModel
|
sourceModel: root.communityHoldingsModel
|
||||||
|
|
||||||
filters: [
|
filters: [
|
||||||
ExpressionFilter {
|
// The only permissions to be discarded are if they are private and NOT met
|
||||||
expression: d.filterPermissions(model)
|
FastExpressionFilter {
|
||||||
|
expression: { return !!model && !(!model.tokenCriteriaMet && model.isPrivate) }
|
||||||
|
expectedRoles: ["tokenCriteriaMet", "isPrivate"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -108,10 +112,10 @@ Control {
|
||||||
id: communityRequirements
|
id: communityRequirements
|
||||||
|
|
||||||
visible: root.joinCommunity
|
visible: root.joinCommunity
|
||||||
introText: d.communityPermissionsModel.count > 0 ?
|
introText: !d.onlyPrivateNotMetPermissions ?
|
||||||
qsTr("To join <b>%1</b> you need to prove that you hold").arg(root.communityName) :
|
qsTr("To join <b>%1</b> you need to prove that you hold").arg(root.communityName) :
|
||||||
qsTr("Sorry, you can't join <b>%1</b> because it's a private, closed community").arg(root.communityName)
|
qsTr("Sorry, you can't join <b>%1</b> because it's a private, closed community").arg(root.communityName)
|
||||||
model: d.communityPermissionsModel
|
model: d.visiblePermissionsModel
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomHoldingsListPanel {
|
CustomHoldingsListPanel {
|
||||||
|
@ -123,10 +127,10 @@ Control {
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomHoldingsListPanel {
|
CustomHoldingsListPanel {
|
||||||
visible: !root.joinCommunity && d.viewAndPostPermissionsModel.count > 0
|
visible: (!root.joinCommunity && d.viewAndPostPermissionsModel.count > 0) || root.allChannelsAreHiddenBecauseNotPermitted
|
||||||
introText: root.requiresRequest ?
|
introText: root.allChannelsAreHiddenBecauseNotPermitted ? d.allChannelsAreHiddenBecauseNotPermittedText :
|
||||||
qsTr("To view and post in the <b>#%1</b> channel you need to join <b>%2</b> and prove that you hold").arg(root.channelName).arg(root.communityName) :
|
root.requiresRequest ? qsTr("To view and post in the <b>#%1</b> channel you need to join <b>%2</b> and prove that you hold").arg(root.channelName).arg(root.communityName) :
|
||||||
qsTr("To view and post in the <b>#%1</b> channel you need to hold").arg(root.channelName)
|
qsTr("To view and post in the <b>#%1</b> channel you need to hold").arg(root.channelName)
|
||||||
model: d.viewAndPostPermissionsModel
|
model: d.viewAndPostPermissionsModel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,17 +142,26 @@ Control {
|
||||||
|
|
||||||
StatusButton {
|
StatusButton {
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
visible: !root.showOnlyPanels && !root.isJoinRequestRejected && root.requiresRequest
|
visible: !root.showOnlyPanels
|
||||||
text: root.isInvitationPending ? (root.joinCommunity ? d.communityMembershipRequestPendingText : d.channelMembershipRequestPendingText)
|
&& !root.isJoinRequestRejected
|
||||||
: d.communityRequestToJoinText
|
&& root.requiresRequest
|
||||||
font.pixelSize: 13
|
&& !d.onlyPrivateNotMetPermissions
|
||||||
enabled: root.requirementsMet || (joinCommunity && d.communityPermissionsModel.count === 0)
|
&& !root.allChannelsAreHiddenBecauseNotPermitted
|
||||||
onClicked: root.isInvitationPending ? root.invitationPendingClicked() : root.requestToJoinClicked()
|
text: root.isInvitationPending ? (root.joinCommunity ? d.communityMembershipRequestPendingText : d.channelMembershipRequestPendingText)
|
||||||
|
: d.communityRequestToJoinText
|
||||||
|
font.pixelSize: 13
|
||||||
|
enabled: root.requirementsMet || (root.joinCommunity && d.visiblePermissionsModel.count === 0)
|
||||||
|
|
||||||
|
onClicked: root.isInvitationPending ? root.invitationPendingClicked() : root.requestToJoinClicked()
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusBaseText {
|
StatusBaseText {
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
visible: !root.showOnlyPanels && !root.requirementsCheckPending && (root.isJoinRequestRejected || !root.requirementsMet)
|
visible: !root.showOnlyPanels
|
||||||
|
&& !root.requirementsCheckPending
|
||||||
|
&& (root.isJoinRequestRejected || !root.requirementsMet)
|
||||||
|
&& !d.onlyPrivateNotMetPermissions
|
||||||
|
&& !root.allChannelsAreHiddenBecauseNotPermitted
|
||||||
text: root.isJoinRequestRejected ? d.memberchipRequestRejectedText :
|
text: root.isJoinRequestRejected ? d.memberchipRequestRejectedText :
|
||||||
(root.joinCommunity ? d.communityRequirementsNotMetText : d.channelRequirementsNotMetText)
|
(root.joinCommunity ? d.communityRequirementsNotMetText : d.channelRequirementsNotMetText)
|
||||||
color: Theme.palette.dangerColor1
|
color: Theme.palette.dangerColor1
|
||||||
|
|
|
@ -96,16 +96,15 @@ QtObject {
|
||||||
readonly property var becomeMemberPermissionsModel: SortFilterProxyModel {
|
readonly property var becomeMemberPermissionsModel: SortFilterProxyModel {
|
||||||
id: becomeMemberPermissionsModel
|
id: becomeMemberPermissionsModel
|
||||||
sourceModel: root.permissionsModel
|
sourceModel: root.permissionsModel
|
||||||
function filterPredicate(modelData) {
|
function filterPredicate(permissionType) {
|
||||||
return (modelData.permissionType === Constants.permissionType.member ||
|
return (permissionType === Constants.permissionType.member ||
|
||||||
modelData.permissionType === Constants.permissionType.admin ||
|
permissionType === Constants.permissionType.admin ||
|
||||||
modelData.permissionType === Constants.permissionType.becomeTokenMaster) &&
|
permissionType === Constants.permissionType.becomeTokenMaster)
|
||||||
(modelData.tokenCriteriaMet || !modelData.isPrivate)
|
|
||||||
}
|
}
|
||||||
filters: [
|
filters: [
|
||||||
FastExpressionFilter {
|
FastExpressionFilter {
|
||||||
expression: becomeMemberPermissionsModel.filterPredicate(model)
|
expression: { return becomeMemberPermissionsModel.filterPredicate(model.permissionType) }
|
||||||
expectedRoles: ["permissionType", "tokenCriteriaMet", "isPrivate"]
|
expectedRoles: ["permissionType"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue