352 lines
14 KiB
QML
352 lines
14 KiB
QML
import QtQuick 2.13
|
||
import QtQuick.Controls 2.13
|
||
import QtQuick.Dialogs 1.2
|
||
import QtGraphicalEffects 1.13
|
||
import QtQuick.Layouts 1.13
|
||
|
||
import StatusQ.Components 0.1
|
||
import StatusQ.Popups 0.1
|
||
|
||
|
||
import utils 1.0
|
||
import shared 1.0
|
||
import shared.popups 1.0
|
||
import shared.status 1.0
|
||
import "../popups/community"
|
||
import "../panels/communities"
|
||
|
||
Item {
|
||
id: root
|
||
width: 304
|
||
height: parent.height
|
||
|
||
property var store
|
||
// TODO unhardcode
|
||
property int chatGroupsListViewCount: communityChatListAndCategories.chatList.count
|
||
property Component pinnedMessagesPopupComponent
|
||
|
||
StatusChatInfoToolBar {
|
||
id: communityHeader
|
||
anchors.top: parent.top
|
||
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
||
chatInfoButton.title: root.store.chatsModelInst.communities.activeCommunity.name
|
||
chatInfoButton.subTitle: root.store.chatsModelInst.communities.activeCommunity.nbMembers === 1 ?
|
||
//% "1 Member"
|
||
qsTrId("1-member") :
|
||
//% "%1 Members"
|
||
qsTrId("-1-members").arg(root.store.chatsModelInst.communities.activeCommunity.nbMembers)
|
||
chatInfoButton.image.source: root.store.chatsModelInst.communities.activeCommunity.thumbnailImage
|
||
chatInfoButton.icon.color: root.store.chatsModelInst.communities.activeCommunity.communityColor
|
||
menuButton.visible: root.store.chatsModelInst.communities.activeCommunity.admin && root.store.chatsModelInst.communities.activeCommunity.canManageUsers
|
||
chatInfoButton.onClicked: openPopup(communityProfilePopup, {
|
||
community: root.store.chatsModelInst.communities.activeCommunity
|
||
})
|
||
|
||
popupMenu: StatusPopupMenu {
|
||
StatusMenuItem {
|
||
//% "Create channel"
|
||
text: qsTrId("create-channel")
|
||
icon.name: "channel"
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
onTriggered: openPopup(createChannelPopup, {communityId: chatsModel.communities.activeCommunity.id})
|
||
}
|
||
|
||
StatusMenuItem {
|
||
//% "Create category"
|
||
text: qsTrId("create-category")
|
||
icon.name: "channel-category"
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
onTriggered: openPopup(createCategoryPopup, {communityId: chatsModel.communities.activeCommunity.id})
|
||
}
|
||
|
||
StatusMenuSeparator {}
|
||
|
||
StatusMenuItem {
|
||
//% "Invite people"
|
||
text: qsTrId("invite-people")
|
||
icon.name: "share-ios"
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.canManageUsers
|
||
onTriggered: openPopup(inviteFriendsToCommunityPopup, {
|
||
community: root.store.chatsModelInst.communities.activeCommunity
|
||
})
|
||
}
|
||
}
|
||
}
|
||
Loader {
|
||
id: membershipRequests
|
||
|
||
property int nbRequests: root.store.chatsModelInst.communities.activeCommunity.communityMembershipRequests.nbRequests
|
||
|
||
anchors.top: communityHeader.bottom
|
||
anchors.topMargin: active ? 8 : 0
|
||
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
||
active: root.store.chatsModelInst.communities.activeCommunity.admin && nbRequests > 0
|
||
height: nbRequests > 0 ? 64 : 0
|
||
sourceComponent: Component {
|
||
StatusContactRequestsIndicatorListItem {
|
||
//% "Membership requests"
|
||
title: qsTrId("membership-requests")
|
||
requestsCount: membershipRequests.nbRequests
|
||
sensor.onClicked: openPopup(membershipRequestPopup)
|
||
}
|
||
}
|
||
}
|
||
|
||
ScrollView {
|
||
id: chatGroupsContainer
|
||
anchors.top: membershipRequests.bottom
|
||
anchors.topMargin: Style.current.padding
|
||
anchors.bottom: parent.bottom
|
||
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
||
width: parent.width
|
||
|
||
leftPadding: Style.current.halfPadding
|
||
rightPadding: Style.current.halfPadding
|
||
|
||
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
|
||
}
|
||
|
||
draggableItems: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
draggableCategories: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
chatList.model: root.store.chatsModelInst.communities.activeCommunity.chats
|
||
|
||
categoryList.model: root.store.chatsModelInst.communities.activeCommunity.categories
|
||
|
||
showCategoryActionButtons: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
showPopupMenu: root.store.chatsModelInst.communities.activeCommunity.admin && chatsModel.communities.activeCommunity.canManageUsers
|
||
selectedChatId: root.store.chatsModelInst.channelView.activeChannel.id
|
||
|
||
onChatItemSelected: root.store.chatsModelInst.channelView.setActiveChannel(id)
|
||
onChatItemUnmuted: root.store.chatsModelInst.channelView.unmuteChatItem(id)
|
||
onChatItemReordered: function (categoryId, id, from, to) {
|
||
root.store.chatsModelInst.communities.reorderCommunityChannel(chatsModel.communities.activeCommunity.id, categoryId, id, to);
|
||
}
|
||
onChatListCategoryReordered: function (categoryId, from, to) {
|
||
root.store.chatsModelInst.communities.reorderCommunityCategories(chatsModel.communities.activeCommunity.id, categoryId, to);
|
||
}
|
||
|
||
onCategoryAddButtonClicked: openPopup(createChannelPopup, {
|
||
communityId: root.store.chatsModelInst.communities.activeCommunity.id,
|
||
categoryId: id
|
||
})
|
||
|
||
popupMenu: StatusPopupMenu {
|
||
StatusMenuItem {
|
||
//% "Create channel"
|
||
text: qsTrId("create-channel")
|
||
icon.name: "channel"
|
||
enabled: chatsModel.communities.activeCommunity.admin
|
||
onTriggered: openPopup(createChannelPopup, {communityId: root.store.chatsModelInst.communities.activeCommunity.id})
|
||
}
|
||
|
||
StatusMenuItem {
|
||
//% "Create category"
|
||
text: qsTrId("create-category")
|
||
icon.name: "channel-category"
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
onTriggered: openPopup(createCategoryPopup, {communityId: root.store.chatsModelInst.communities.activeCommunity.id})
|
||
}
|
||
|
||
StatusMenuSeparator {}
|
||
|
||
StatusMenuItem {
|
||
//% "Invite people"
|
||
text: qsTrId("invite-people")
|
||
icon.name: "share-ios"
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.canManageUsers
|
||
onTriggered: openPopup(inviteFriendsToCommunityPopup, {
|
||
community: root.store.chatsModelInst.communities.activeCommunity
|
||
})
|
||
}
|
||
}
|
||
|
||
categoryPopupMenu: StatusPopupMenu {
|
||
|
||
property var categoryItem
|
||
|
||
openHandler: function (id) {
|
||
categoryItem = root.store.chatsModelInst.communities.activeCommunity.getCommunityCategoryItemById(id)
|
||
}
|
||
|
||
StatusMenuItem {
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
//% "Edit Category"
|
||
text: qsTrId("edit-category")
|
||
icon.name: "edit"
|
||
onTriggered: {
|
||
openPopup(createCategoryPopup, {
|
||
communityId: root.store.chatsModelInst.communities.activeCommunity.id,
|
||
isEdit: true,
|
||
categoryId: categoryItem.id,
|
||
categoryName: categoryItem.name
|
||
})
|
||
}
|
||
}
|
||
|
||
StatusMenuSeparator {
|
||
visible: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
}
|
||
|
||
StatusMenuItem {
|
||
enabled: root.store.chatsModelInst.communities.activeCommunity.admin
|
||
//% "Delete Category"
|
||
text: qsTrId("delete-category")
|
||
icon.name: "delete"
|
||
type: StatusMenuItem.Type.Danger
|
||
onTriggered: {
|
||
openPopup(deleteCategoryConfirmationDialogComponent, {
|
||
//% "Delete %1 category"
|
||
title: qsTrId("delete--1-category").arg(categoryItem.name),
|
||
//% "Are you sure you want to delete %1 category? Channels inside the category won’t be deleted."
|
||
confirmationText: qsTrId("are-you-sure-you-want-to-delete--1-category--channels-inside-the-category-won-t-be-deleted-")
|
||
.arg(categoryItem.name),
|
||
categoryId: categoryItem.id
|
||
})
|
||
}
|
||
}
|
||
}
|
||
|
||
chatListPopupMenu: ChatContextMenuView {
|
||
store: root.store
|
||
openHandler: function (id) {
|
||
chatItem = root.store.chatsModelInst.channelView.getChatItemById(id)
|
||
}
|
||
}
|
||
}
|
||
|
||
Loader {
|
||
id: emptyViewAndSuggestionsLoader
|
||
active: root.store.chatsModelInst.communities.activeCommunity.admin && !appSettings.hiddenCommunityWelcomeBanners.includes(root.store.chatsModelInst.communities.activeCommunity.id)
|
||
width: parent.width
|
||
height: active ? item.height : 0
|
||
anchors.top: communityChatListAndCategories.bottom
|
||
anchors.topMargin: active ? Style.current.padding : 0
|
||
sourceComponent: Component {
|
||
CommunityWelcomeBannerPanel {
|
||
activeCommunity: store.activeCommunity
|
||
}
|
||
}
|
||
}
|
||
|
||
Loader {
|
||
id: backUpBannerLoader
|
||
active: root.store.chatsModelInst.communities.activeCommunity.admin && !appSettings.hiddenCommunityBackUpBanners.includes(root.store.chatsModelInst.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
|
||
|
||
BackUpCommuntyBannerPanel {
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
Component {
|
||
id: createChannelPopup
|
||
CreateChannelPopup {
|
||
anchors.centerIn: parent
|
||
store: root.store
|
||
pinnedMessagesPopupComponent: root.pinnedMessagesPopupComponent
|
||
onClosed: {
|
||
destroy()
|
||
}
|
||
}
|
||
}
|
||
|
||
Component {
|
||
id: createCategoryPopup
|
||
CreateCategoryPopup {
|
||
anchors.centerIn: parent
|
||
store: root.store
|
||
onClosed: {
|
||
destroy()
|
||
}
|
||
}
|
||
}
|
||
|
||
Component {
|
||
id: deleteCategoryConfirmationDialogComponent
|
||
ConfirmationDialog {
|
||
property string categoryId
|
||
btnType: "warn"
|
||
showCancelButton: true
|
||
onClosed: {
|
||
destroy()
|
||
}
|
||
onCancelButtonClicked: {
|
||
close();
|
||
}
|
||
onConfirmButtonClicked: function(){
|
||
const error = root.store.chatsModelInst.communities.deleteCommunityCategory(root.store.chatsModelInst.communities.activeCommunity.id, categoryId)
|
||
if (error) {
|
||
creatingError.text = error
|
||
return creatingError.open()
|
||
}
|
||
close();
|
||
}
|
||
}
|
||
}
|
||
|
||
MessageDialog {
|
||
id: deleteError
|
||
//% "Error deleting the category"
|
||
title: qsTrId("error-deleting-the-category")
|
||
icon: StandardIcon.Critical
|
||
standardButtons: StandardButton.Ok
|
||
}
|
||
|
||
Component {
|
||
id: membershipRequestPopup
|
||
MembershipRequestsPopup {
|
||
anchors.centerIn: parent
|
||
store: root.store
|
||
onClosed: {
|
||
destroy()
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/*##^##
|
||
Designer {
|
||
D{i:0;autoSize:true;formeditorColor:"#ffffff";height:480;width:640}
|
||
}
|
||
##^##*/
|