158 lines
5.9 KiB
QML
158 lines
5.9 KiB
QML
import QtQuick 2.14
|
|
import QtQuick.Layouts 1.14
|
|
import QtQuick.Controls 2.14
|
|
|
|
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 "../../layouts"
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property string placeholderText
|
|
property var model
|
|
|
|
signal userProfileClicked(string id)
|
|
signal kickUserClicked(string id, string name)
|
|
signal banUserClicked(string id, string name)
|
|
signal unbanUserClicked(string id)
|
|
|
|
signal acceptRequestToJoin(string id)
|
|
signal declineRequestToJoin(string id)
|
|
|
|
enum TabType {
|
|
AllMembers,
|
|
BannedMembers,
|
|
PendingRequests,
|
|
DeclinedRequests
|
|
}
|
|
|
|
property int panelType: CommunityMembersTabPanel.TabType.AllMembers
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
spacing: 30
|
|
|
|
StatusInput {
|
|
id: memberSearch
|
|
Layout.preferredWidth: 350
|
|
Layout.leftMargin: 12
|
|
maximumHeight: 36
|
|
topPadding: 0
|
|
bottomPadding: 0
|
|
rightPadding: 0
|
|
placeholderText: root.placeholderText
|
|
input.icon.name: "search"
|
|
enabled: model.count > 0
|
|
}
|
|
|
|
ListView {
|
|
id: membersList
|
|
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
|
|
model: root.model
|
|
clip: true
|
|
spacing: 15
|
|
|
|
delegate: StatusMemberListItem {
|
|
id: memberItem
|
|
|
|
readonly property bool itsMe: model.pubKey.toLowerCase() === userProfile.pubKey.toLowerCase()
|
|
readonly property bool isHovered: memberItem.sensor.containsMouse
|
|
readonly property bool canBeBanned: !memberItem.itsMe && !model.isAdmin
|
|
|
|
statusListItemComponentsSlot.spacing: 16
|
|
statusListItemTitleArea.anchors.rightMargin: 0
|
|
statusListItemSubTitle.elide: Text.ElideRight
|
|
rightPadding: 75
|
|
leftPadding: 12
|
|
|
|
components: [
|
|
StatusButton {
|
|
visible: (root.panelType === CommunityMembersTabPanel.TabType.AllMembers) && isHovered && canBeBanned
|
|
text: qsTr("Kick")
|
|
type: StatusBaseButton.Type.Danger
|
|
size: StatusBaseButton.Size.Small
|
|
onClicked: root.kickUserClicked(model.pubKey, model.displayName)
|
|
},
|
|
|
|
StatusButton {
|
|
visible: (root.panelType === CommunityMembersTabPanel.TabType.AllMembers) && isHovered && canBeBanned
|
|
text: qsTr("Ban")
|
|
type: StatusBaseButton.Type.Danger
|
|
size: StatusBaseButton.Size.Small
|
|
onClicked: root.banUserClicked(model.pubKey, model.displayName)
|
|
},
|
|
|
|
StatusButton {
|
|
visible: (root.panelType === CommunityMembersTabPanel.TabType.BannedMembers) && isHovered && canBeBanned
|
|
text: qsTr("Unban")
|
|
type: StatusBaseButton.Type.Normal
|
|
size: StatusBaseButton.Size.Large
|
|
onClicked: root.unbanUserClicked(model.pubKey)
|
|
width: 95
|
|
height: 44
|
|
},
|
|
|
|
StatusButton {
|
|
visible: (root.panelType === CommunityMembersTabPanel.TabType.PendingRequests ||
|
|
root.panelType === CommunityMembersTabPanel.TabType.DeclinedRequests) && isHovered
|
|
text: qsTr("Accept")
|
|
type: StatusBaseButton.Type.Normal
|
|
size: StatusBaseButton.Size.Large
|
|
icon.name: "checkmark-circle"
|
|
icon.color: Theme.palette.successColor1
|
|
normalColor: Theme.palette.successColor2
|
|
hoverColor: Theme.palette.successColor3
|
|
textColor: Theme.palette.successColor1
|
|
onClicked: root.acceptRequestToJoin(model.requestToJoinId)
|
|
width: 124
|
|
height: 44
|
|
},
|
|
|
|
StatusButton {
|
|
visible: (root.panelType === CommunityMembersTabPanel.TabType.PendingRequests) && isHovered
|
|
text: qsTr("Reject")
|
|
type: StatusBaseButton.Type.Danger
|
|
icon.name: "close-circle"
|
|
icon.color: Style.current.danger
|
|
onClicked: root.declineRequestToJoin(model.requestToJoinId)
|
|
width: 118
|
|
height: 44
|
|
}
|
|
]
|
|
|
|
width: membersList.width
|
|
visible: memberSearch.text === "" || title.toLowerCase().includes(memberSearch.text.toLowerCase())
|
|
height: visible ? implicitHeight : 0
|
|
color: "transparent"
|
|
|
|
pubKey: Utils.getElidedCompressedPk(model.pubKey)
|
|
nickName: model.localNickname
|
|
userName: model.displayName
|
|
status: model.onlineStatus
|
|
icon.color: Theme.palette.userCustomizationColors[Utils.colorIdForPubkey(model.pubKey)] // FIXME: use model.colorId
|
|
image.source: model.icon
|
|
image.isIdenticon: false
|
|
image.width: 40
|
|
image.height: 40
|
|
icon.height: 40
|
|
icon.width: 40
|
|
ringSettings.ringSpecModel: Utils.getColorHashAsJson(model.pubKey)
|
|
statusListItemIcon.badge.visible: (root.panelType === CommunityMembersTabPanel.TabType.AllMembers)
|
|
|
|
onClicked: root.userProfileClicked(model.pubKey)
|
|
}
|
|
}
|
|
}
|
|
}
|