fix(@desktop/permissions): Hide permissions list in sharing addresses dialog if only base permissions are set

Fix #12884
This commit is contained in:
Michal Iskierko 2024-01-18 15:06:25 +01:00 committed by Michał Iskierko
parent edf7e82932
commit 46c69cf0a8
6 changed files with 70 additions and 11 deletions

View File

@ -60,7 +60,7 @@ type
type type
JoiningCommunityDetails = object JoiningCommunityDetails = object
communityId: string communityId: string
communityIdForChannelsPermisisons: string communityIdForPermissions: string
communityIdForRevealedAccounts: string communityIdForRevealedAccounts: string
ensName: string ensName: string
addressesToShare: OrderedTable[string, AddressToShareDetails] ## [address, AddressToShareDetails] addressesToShare: OrderedTable[string, AddressToShareDetails] ## [address, AddressToShareDetails]
@ -818,9 +818,14 @@ method getCommunityPublicKeyFromPrivateKey*(self: Module, communityPrivateKey: s
result = self.controller.getCommunityPublicKeyFromPrivateKey(communityPrivateKey) result = self.controller.getCommunityPublicKeyFromPrivateKey(communityPrivateKey)
method checkPermissions*(self: Module, communityId: string, sharedAddresses: seq[string]) = method checkPermissions*(self: Module, communityId: string, sharedAddresses: seq[string]) =
self.joiningCommunityDetails.communityIdForChannelsPermisisons = communityId self.joiningCommunityDetails.communityIdForPermissions = communityId
self.controller.asyncCheckPermissionsToJoin(communityId, sharedAddresses) self.controller.asyncCheckPermissionsToJoin(communityId, sharedAddresses)
self.checkingPermissionToJoinInProgress = true
self.controller.asyncCheckAllChannelsPermissions(communityId, sharedAddresses) self.controller.asyncCheckAllChannelsPermissions(communityId, sharedAddresses)
self.checkingAllChannelPermissionsInProgress = true
self.view.setCheckingPermissionsInProgress(inProgress = true) self.view.setCheckingPermissionsInProgress(inProgress = true)
method prepareTokenModelForCommunity*(self: Module, communityId: string) = method prepareTokenModelForCommunity*(self: Module, communityId: string) =
@ -898,7 +903,8 @@ method onCommunityCheckAllChannelPermissionsFailed*(self: Module, communityId: s
method onCommunityCheckPermissionsToJoinResponse*(self: Module, communityId: string, method onCommunityCheckPermissionsToJoinResponse*(self: Module, communityId: string,
checkPermissionsToJoinResponse: CheckPermissionsToJoinResponseDto) = checkPermissionsToJoinResponse: CheckPermissionsToJoinResponseDto) =
if self.joiningCommunityDetails.communityId != communityId: if not self.checkingPermissionToJoinInProgress and
self.joiningCommunityDetails.communityIdForPermissions != communityId:
return return
self.applyPermissionResponse(communityId, checkPermissionsToJoinResponse.permissions) self.applyPermissionResponse(communityId, checkPermissionsToJoinResponse.permissions)
self.checkingPermissionToJoinInProgress = false self.checkingPermissionToJoinInProgress = false
@ -906,7 +912,8 @@ method onCommunityCheckPermissionsToJoinResponse*(self: Module, communityId: str
method onCommunityCheckAllChannelsPermissionsResponse*(self: Module, communityId: string, method onCommunityCheckAllChannelsPermissionsResponse*(self: Module, communityId: string,
checkChannelPermissionsResponse: CheckAllChannelsPermissionsResponseDto) = checkChannelPermissionsResponse: CheckAllChannelsPermissionsResponseDto) =
if self.joiningCommunityDetails.communityIdForChannelsPermisisons != communityId: if not self.checkingAllChannelPermissionsInProgress and
self.joiningCommunityDetails.communityIdForPermissions != communityId:
return return
self.checkingAllChannelPermissionsInProgress = false self.checkingAllChannelPermissionsInProgress = false
self.updateCheckingPermissionsInProgressIfNeeded(inProgress = false) self.updateCheckingPermissionsInProgressIfNeeded(inProgress = false)

View File

@ -20,7 +20,10 @@ proc `$`*(self: TokenPermissionItem): string =
result = fmt"""TokenPermissionItem( result = fmt"""TokenPermissionItem(
id: {self.id}, id: {self.id},
type: {self.type}, type: {self.type},
]""" isPrivate: {self.isPrivate},
tokenCriteriaMet: {self.tokenCriteriaMet},
state: {self.state}
)"""
proc initTokenPermissionItem*( proc initTokenPermissionItem*(
id: string, id: string,

View File

@ -1550,7 +1550,6 @@ QtObject:
raise newException(RpcException, error.message) raise newException(RpcException, error.message)
let checkPermissionsToJoinResponse = rpcResponseObj["response"]["result"].toCheckPermissionsToJoinResponseDto let checkPermissionsToJoinResponse = rpcResponseObj["response"]["result"].toCheckPermissionsToJoinResponseDto
self.events.emit(SIGNAL_CHECK_PERMISSIONS_TO_JOIN_RESPONSE, CheckPermissionsToJoinResponseArgs( self.events.emit(SIGNAL_CHECK_PERMISSIONS_TO_JOIN_RESPONSE, CheckPermissionsToJoinResponseArgs(
communityId: communityId, communityId: communityId,
checkPermissionsToJoinResponse: checkPermissionsToJoinResponse checkPermissionsToJoinResponse: checkPermissionsToJoinResponse

View File

@ -215,7 +215,7 @@ Control {
radius: Style.current.padding radius: Style.current.padding
border.width: 1 border.width: 1
border.color: Theme.palette.baseColor3 border.color: Theme.palette.baseColor3
visible: d.hasPermissions visible: permissionsView.hasAnyVisiblePermission
layer.enabled: true layer.enabled: true
layer.effect: DropShadow { layer.effect: DropShadow {
@ -240,7 +240,7 @@ Control {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: -Style.current.padding // compensate for the half-rounded divider above Layout.topMargin: -Style.current.padding // compensate for the half-rounded divider above
visible: d.hasPermissions visible: permissionsView.hasAnyVisiblePermission
} }
} }
} }

View File

@ -33,6 +33,10 @@ Rectangle {
implicitHeight: permissionsScrollView.contentHeight - permissionsScrollView.anchors.topMargin implicitHeight: permissionsScrollView.contentHeight - permissionsScrollView.anchors.topMargin
color: Theme.palette.baseColor2 color: Theme.palette.baseColor2
readonly property bool hasAnyVisiblePermission: root.permissionsModel && root.permissionsModel.count &&
(d.tokenMasterPermissionsModel.count > 0 || d.adminPermissionsModel.count > 0 ||
d.joinPermissionsModel.count > 0 || d.channelsPermissionsModel.count > 0)
QtObject { QtObject {
id: d id: d
@ -62,12 +66,23 @@ Rectangle {
readonly property bool lostChannelPermissions: root.isEditMode && d.uniquePermissionChannels.length > 0 && channelPermissionsPanel.anyPermissionLost readonly property bool lostChannelPermissions: root.isEditMode && d.uniquePermissionChannels.length > 0 && channelPermissionsPanel.anyPermissionLost
// models // models
readonly property var tokenMasterPermissionsModel: SortFilterProxyModel {
id: tokenMasterPermissionsModel
sourceModel: root.permissionsModel
function filterPredicate(modelData) {
return (modelData.permissionType === Constants.permissionType.becomeTokenMaster)
&& modelData.tokenCriteriaMet
}
filters: ExpressionFilter {
expression: tokenMasterPermissionsModel.filterPredicate(model)
}
}
readonly property var adminPermissionsModel: SortFilterProxyModel { readonly property var adminPermissionsModel: SortFilterProxyModel {
id: adminPermissionsModel id: adminPermissionsModel
sourceModel: root.permissionsModel sourceModel: root.permissionsModel
function filterPredicate(modelData) { function filterPredicate(modelData) {
return (modelData.permissionType === Constants.permissionType.admin) && return (modelData.permissionType === Constants.permissionType.admin) &&
(modelData.tokenCriteriaMet && !modelData.isPrivate) // admin privs are hidden if criteria not met (!modelData.isPrivate || (modelData.tokenCriteriaMet && modelData.isPrivate)) // visible or (hidden & met)
} }
filters: ExpressionFilter { filters: ExpressionFilter {
expression: adminPermissionsModel.filterPredicate(model) expression: adminPermissionsModel.filterPredicate(model)
@ -78,12 +93,25 @@ Rectangle {
sourceModel: root.permissionsModel sourceModel: root.permissionsModel
function filterPredicate(modelData) { function filterPredicate(modelData) {
return (modelData.permissionType === Constants.permissionType.member) && return (modelData.permissionType === Constants.permissionType.member) &&
(modelData.tokenCriteriaMet || !modelData.isPrivate) (!modelData.isPrivate || (modelData.tokenCriteriaMet && modelData.isPrivate)) // visible or (hidden & met)
} }
filters: ExpressionFilter { filters: ExpressionFilter {
expression: joinPermissionsModel.filterPredicate(model) expression: joinPermissionsModel.filterPredicate(model)
} }
} }
// used to check if there are any visible channel permissions
readonly property var channelsPermissionsModel: SortFilterProxyModel {
id: channelsPermissionsModel
sourceModel: root.permissionsModel
function filterPredicate(modelData) {
return (modelData.permissionType === Constants.permissionType.read || modelData.permissionType === Constants.permissionType.viewAndPost) &&
(!modelData.isPrivate || (modelData.tokenCriteriaMet && modelData.isPrivate)) // visible or (hidden & met)
}
filters: ExpressionFilter {
expression: channelsPermissionsModel.filterPredicate(model)
}
}
} }
Component.onCompleted: { Component.onCompleted: {
@ -118,6 +146,11 @@ Rectangle {
} }
// permission types // permission types
PermissionPanel {
id: tokenMasterPermissionPanel
permissionType: PermissionTypes.Type.TokenMaster
permissionsModel: d.tokenMasterPermissionsModel
}
PermissionPanel { PermissionPanel {
id: joinPermissionPanel id: joinPermissionPanel
permissionType: PermissionTypes.Type.Member permissionType: PermissionTypes.Type.Member
@ -178,6 +211,8 @@ Rectangle {
return qsTr("Become an admin") return qsTr("Become an admin")
case PermissionTypes.Type.Member: case PermissionTypes.Type.Member:
return qsTr("Join %1").arg(root.communityName) return qsTr("Join %1").arg(root.communityName)
case PermissionTypes.Type.TokenMaster:
return qsTr("Become a TokenMaster")
default: default:
return d.uniquePermissionChannels[index][1] return d.uniquePermissionChannels[index][1]
} }
@ -326,6 +361,8 @@ Rectangle {
return qsTr("View only") return qsTr("View only")
case PermissionTypes.Type.ViewAndPost: case PermissionTypes.Type.ViewAndPost:
return qsTr("View & post") return qsTr("View & post")
case PermissionTypes.Type.TokenMaster:
return qsTr("TokenMaster")
default: default:
return "???" return "???"
} }
@ -354,6 +391,15 @@ Rectangle {
padding: d.absLeftMargin padding: d.absLeftMargin
background: PanelBg {} background: PanelBg {}
visible: {
for (var i = 0; i < channelPermsRepeater.count; i++) {
var chanPermissionItem = channelPermsRepeater.itemAt(i);
if (chanPermissionItem.channelPermissionsModel.count > 0)
return true
}
return false
}
readonly property string channelKey: modelData[0] readonly property string channelKey: modelData[0]
readonly property bool readPermissionMet: channelPermsRepeater.count > 0 ? channelPermsRepeater.itemAt(0).tokenCriteriaMet : false readonly property bool readPermissionMet: channelPermsRepeater.count > 0 ? channelPermsRepeater.itemAt(0).tokenCriteriaMet : false
readonly property bool viewAndPostPermissionMet: channelPermsRepeater.count > 1 ? channelPermsRepeater.itemAt(1).tokenCriteriaMet : false readonly property bool viewAndPostPermissionMet: channelPermsRepeater.count > 1 ? channelPermsRepeater.itemAt(1).tokenCriteriaMet : false
@ -377,6 +423,7 @@ Rectangle {
readonly property int permissionType: modelData readonly property int permissionType: modelData
readonly property alias tokenCriteriaMet: overallPermissionRow2.tokenCriteriaMet readonly property alias tokenCriteriaMet: overallPermissionRow2.tokenCriteriaMet
readonly property bool permissionLost: d.initialChannelPermissions[channelPermsPanel.channelKey][index] && !tokenCriteriaMet readonly property bool permissionLost: d.initialChannelPermissions[channelPermsPanel.channelKey][index] && !tokenCriteriaMet
readonly property alias channelPermissionsModel: permissionsRepeater2.model
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: grid2.implicitHeight + grid2.anchors.margins*2 Layout.preferredHeight: grid2.implicitHeight + grid2.anchors.margins*2
@ -384,6 +431,7 @@ Rectangle {
border.color: d.tableBorderColor border.color: d.tableBorderColor
radius: Style.current.radius radius: Style.current.radius
color: "transparent" color: "transparent"
visible: permissionsRepeater2.model.count > 0
GridLayout { GridLayout {
id: grid2 id: grid2
@ -405,7 +453,7 @@ Rectangle {
sourceModel: root.permissionsModel sourceModel: root.permissionsModel
function filterPredicate(modelData) { function filterPredicate(modelData) {
return modelData.permissionType === channelPermsSubPanel.permissionType && return modelData.permissionType === channelPermsSubPanel.permissionType &&
!modelData.isPrivate && (!modelData.isPrivate || (modelData.tokenCriteriaMet && modelData.isPrivate)) &&
ModelUtils.contains(modelData.channelsListModel, "key", channelPermsPanel.channelKey) // filter and group by channel "key" ModelUtils.contains(modelData.channelsListModel, "key", channelPermsPanel.channelKey) // filter and group by channel "key"
} }
filters: ExpressionFilter { filters: ExpressionFilter {

View File

@ -436,6 +436,8 @@ QtObject {
readonly property int member: 2 readonly property int member: 2
readonly property int read: 3 readonly property int read: 3
readonly property int viewAndPost: 4 readonly property int viewAndPost: 4
readonly property int becomeTokenMaster: 5
readonly property int becomeTokenOwner: 6
} }
readonly property QtObject messageContentType: QtObject { readonly property QtObject messageContentType: QtObject {