status-desktop/ui/app/AppLayouts/Chat/CommunityColumn.qml

362 lines
13 KiB
QML
Raw Normal View History

2020-12-11 20:29:46 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Dialogs 1.2
import QtGraphicalEffects 1.13
2020-12-11 20:29:46 +00:00
import QtQuick.Layouts 1.13
import StatusQ.Components 0.1
import StatusQ.Popups 0.1
2020-12-11 20:29:46 +00:00
import "../../../imports"
import "../../../shared"
import "../../../shared/status"
2020-12-11 20:38:10 +00:00
import "./CommunityComponents"
2020-12-11 20:29:46 +00:00
Item {
2020-12-11 20:29:46 +00:00
// TODO unhardcode
property int chatGroupsListViewCount: communityChatListAndCategories.chatList.count
2021-06-02 19:43:33 +00:00
property Component pinnedMessagesPopupComponent
2020-12-11 20:29:46 +00:00
id: root
Layout.fillHeight: true
width: 304
StatusChatInfoToolBar {
2020-12-11 20:29:46 +00:00
id: communityHeader
anchors.top: parent.top
anchors.topMargin: 5
anchors.horizontalCenter: parent.horizontalCenter
chatInfoButton.title: chatsModel.communities.activeCommunity.name
chatInfoButton.subTitle: chatsModel.communities.activeCommunity.nbMembers === 1 ?
qsTr("1 Member") :
qsTr("%1 Members").arg(chatsModel.communities.activeCommunity.nbMembers)
chatInfoButton.image.source: chatsModel.communities.activeCommunity.thumbnailImage
chatInfoButton.icon.color: chatsModel.communities.activeCommunity.communityColor
chatInfoButton.onClicked: communityProfilePopup.open()
popupMenu: StatusPopupMenu {
StatusMenuItem {
text: qsTr("Create channel")
icon.name: "channel"
enabled: chatsModel.communities.activeCommunity.admin
onTriggered: openPopup(createChannelPopup, {communityId: chatsModel.communities.activeCommunity.id})
2020-12-11 20:29:46 +00:00
}
StatusMenuItem {
text: qsTr("Create category")
icon.name: "channel-category"
enabled: chatsModel.communities.activeCommunity.admin
onTriggered: openPopup(createCategoryPopup, {communityId: chatsModel.communities.activeCommunity.id})
}
StatusMenuSeparator {}
StatusMenuItem {
text: qsTr("Invite people")
icon.name: "share-ios"
enabled: chatsModel.communities.activeCommunity.canManageUsers
onTriggered: openPopup(inviteFriendsToCommunityPopup, {communityId: chatsModel.communities.activeCommunity.id})
}
}
}
Loader {
id: membershipRequests
property int nbRequests: chatsModel.communities.activeCommunity.communityMembershipRequests.nbRequests
anchors.top: communityHeader.bottom
anchors.topMargin: active ? 8 : 0
anchors.horizontalCenter: parent.horizontalCenter
active: chatsModel.communities.activeCommunity.admin && nbRequests > 0
sourceComponent: Component {
StatusContactRequestsIndicatorListItem {
title: qsTr("Membership requests")
requestsCount: membershipRequests.nbRequests
sensor.onClicked: membershipRequestPopup.open()
}
}
}
2020-12-11 20:29:46 +00:00
ScrollView {
id: chatGroupsContainer
anchors.top: membershipRequests.bottom
2020-12-11 20:29:46 +00:00
anchors.topMargin: Style.current.padding
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
2020-12-11 20:29:46 +00:00
leftPadding: Style.current.halfPadding
rightPadding: Style.current.halfPadding
2020-12-11 20:29:46 +00:00
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
clip: true
contentHeight: communityChatListAndCategories.height
+ emptyViewAndSuggestionsLoader.height
+ backUpBannerLoader.height
+ 16
StatusChatListAndCategories {
id: communityChatListAndCategories
anchors.horizontalCenter: parent.horizontalCenter
width: root.width
height: {
if (!emptyViewAndSuggestionsLoader.active &&
!backUpBannerLoader.active) {
return implicitHeight > (root.height - 82) ? implicitHeight + 8 : root.height - 82
}
return implicitHeight
}
chatList.model: chatsModel.communities.activeCommunity.chats
categoryList.model: chatsModel.communities.activeCommunity.categories
showCategoryActionButtons: chatsModel.communities.activeCommunity.admin
selectedChatId: chatsModel.channelView.activeChannel.id
onChatItemSelected: chatsModel.channelView.setActiveChannel(id)
onChatItemUnmuted: chatsModel.channelView.unmuteChatItem(id)
onCategoryAddButtonClicked: openPopup(createChannelPopup, {
communityId: chatsModel.communities.activeCommunity.id,
categoryId: id
})
popupMenu: StatusPopupMenu {
StatusMenuItem {
text: qsTr("Create channel")
icon.name: "channel"
enabled: chatsModel.communities.activeCommunity.admin
onTriggered: openPopup(createChannelPopup, {communityId: chatsModel.communities.activeCommunity.id})
}
StatusMenuItem {
text: qsTr("Create category")
icon.name: "channel-category"
enabled: chatsModel.communities.activeCommunity.admin
onTriggered: openPopup(createCategoryPopup, {communityId: chatsModel.communities.activeCommunity.id})
}
2020-12-11 20:29:46 +00:00
StatusMenuSeparator {}
StatusMenuItem {
text: qsTr("Invite people")
icon.name: "share-ios"
enabled: chatsModel.communities.activeCommunity.canManageUsers
onTriggered: openPopup(inviteFriendsToCommunityPopup, {communityId: chatsModel.communities.activeCommunity.id})
}
}
categoryPopupMenu: StatusPopupMenu {
property var categoryItem
openHandler: function (id) {
categoryItem = chatsModel.communities.activeCommunity.getCommunityCategoryItemById(id)
}
StatusMenuItem {
enabled: chatsModel.communities.activeCommunity.admin
text: qsTr("Edit Category")
icon.name: "edit"
onTriggered: {
openPopup(createCategoryPopup, {
communityId: chatsModel.communities.activeCommunity.id,
isEdit: true,
categoryId: categoryItem.id,
categoryName: categoryItem.name
})
}
}
StatusMenuSeparator {
visible: chatsModel.communities.activeCommunity.admin
}
StatusMenuItem {
enabled: chatsModel.communities.activeCommunity.admin
text: qsTr("Delete Category")
icon.name: "delete"
type: StatusMenuItem.Type.Danger
onTriggered: {
openPopup(deleteCategoryConfirmationDialogComponent, {
title: qsTr("Delete %1 category").arg(categoryItem.name),
confirmationText: qsTr("Are you sure you want to delete %1 category? Channels inside the category wont be deleted.")
.arg(categoryItem.name),
categoryId: categoryItem.id
})
}
}
}
chatListPopupMenu: StatusPopupMenu {
property var chatItem
openHandler: function (id) {
chatItem = chatsModel.channelView.getChatItemById(id)
}
2020-12-11 20:29:46 +00:00
StatusMenuItem {
text: chatItem && chatItem.muted ?
qsTr("Unmute chat") :
qsTr("Mute chat")
icon.name: "notification"
onTriggered: {
if (chatItem && chatItem.muted) {
return chatsModel.channelView.unmuteChatItem(chatItem.id)
}
chatsModel.channelView.muteChatItem(chatItem.id)
}
}
StatusMenuItem {
text: "Mark as Read"
icon.name: "checkmark-circle"
onTriggered: chatsModel.channelView.markChatItemAsRead(chatItem.id)
}
StatusMenuItem {
text: "Clear history"
icon.name: "close-circle"
onTriggered: chatsModel.channelView.clearChatHistory(chatItem.id)
}
StatusMenuItem {
text: qsTr("Edit Channel")
icon.name: "edit"
enabled: chatsModel.communities.activeCommunity.admin
onTriggered: openPopup(editChannelPopup, {
communityId: chatsModel.communities.activeCommunity.id,
channel: chatItem
})
}
}
2021-05-16 15:16:42 +00:00
}
Loader {
id: emptyViewAndSuggestionsLoader
active: chatsModel.communities.activeCommunity.admin && !appSettings.hiddenCommunityWelcomeBanners.includes(chatsModel.communities.activeCommunity.id)
2020-12-11 20:29:46 +00:00
width: parent.width
height: active ? item.height : 0
anchors.top: communityChatListAndCategories.bottom
anchors.topMargin: active ? Style.current.padding : 0
sourceComponent: Component {
CommunityWelcomeBanner {}
}
}
Loader {
id: backUpBannerLoader
active: chatsModel.communities.activeCommunity.admin && !appSettings.hiddenCommunityBackUpBanners.includes(chatsModel.communities.activeCommunity.id)
width: parent.width
height: active ? item.height : 0
anchors.top: emptyViewAndSuggestionsLoader.bottom
anchors.topMargin: active ? Style.current.padding : 0
sourceComponent: Component {
Item {
width: parent.width
height: backupBanner.height
BackUpCommuntyBanner {
id: backupBanner
}
MouseArea {
anchors.fill: backupBanner
acceptedButtons: Qt.RightButton
onClicked: {
/* Prevents sending events to the component beneath
if Right Mouse Button is clicked. */
mouse.accepted = false;
}
}
}
}
2020-12-11 20:29:46 +00:00
}
}
Component {
id: createChannelPopup
CreateChannelPopup {
pinnedMessagesPopupComponent: root.pinnedMessagesPopupComponent
onClosed: {
destroy()
}
}
}
Component {
id: createCategoryPopup
CreateCategoryPopup {
onClosed: {
destroy()
}
}
}
Component {
id: transferOwnershipPopup
TransferOwnershipPopup {}
}
CommunityProfilePopup {
id: communityProfilePopup
communityId: chatsModel.communities.activeCommunity.id
name: chatsModel.communities.activeCommunity.name
description: chatsModel.communities.activeCommunity.description
access: chatsModel.communities.activeCommunity.access
nbMembers: chatsModel.communities.activeCommunity.nbMembers
isAdmin: chatsModel.communities.activeCommunity.admin
source: chatsModel.communities.activeCommunity.thumbnailImage
communityColor: chatsModel.communities.activeCommunity.communityColor
}
Component {
id: deleteCategoryConfirmationDialogComponent
ConfirmationDialog {
property string categoryId
btnType: "warn"
height: 216
showCancelButton: true
onClosed: {
destroy()
}
onCancelButtonClicked: {
close();
}
onConfirmButtonClicked: function(){
const error = chatsModel.communities.deleteCommunityCategory(chatsModel.communities.activeCommunity.id, categoryId)
if (error) {
creatingError.text = error
return creatingError.open()
}
close();
}
}
}
MessageDialog {
id: deleteError
title: qsTr("Error deleting the category")
icon: StandardIcon.Critical
standardButtons: StandardButton.Ok
}
MembershipRequestsPopup {
id: membershipRequestPopup
}
2020-12-11 20:29:46 +00:00
}
/*##^##
Designer {
D{i:0;autoSize:true;formeditorColor:"#ffffff";height:480;width:640}
}
##^##*/