2021-05-16 15:16:42 +00:00
import QtQuick 2.12
import QtQuick . Controls 2.3
import QtGraphicalEffects 1.13
import QtQuick . Dialogs 1.3
import "../../../../imports"
import "../../../../shared"
2021-07-09 10:09:03 +00:00
import StatusQ . Core 0.1
import StatusQ . Core . Theme 0.1
import StatusQ . Components 0.1
import StatusQ . Controls 0.1
import StatusQ . Popups 0.1
StatusModal {
2021-05-16 15:16:42 +00:00
property string communityId
2021-05-17 15:05:45 +00:00
property string categoryId
property string categoryName: ""
property var channels: [ ]
property bool isEdit: false
2021-05-16 15:16:42 +00:00
2021-06-29 12:47:28 +00:00
readonly property int maxCategoryNameLength: 30
readonly property var categoryNameValidator: Utils . Validate . NoEmpty
| Utils . Validate . TextLength
2021-05-16 15:16:42 +00:00
id: popup
onOpened: {
2021-05-17 15:05:45 +00:00
if ( isEdit ) {
2021-07-09 10:09:03 +00:00
popup . contentComponent . categoryName . text = categoryName
2021-05-17 15:05:45 +00:00
channels = JSON . parse ( chatsModel . communities . activeCommunity . getChatIdsByCategory ( categoryId ) )
}
2021-07-09 10:09:03 +00:00
popup . contentComponent . categoryName . forceActiveFocus ( Qt . MouseFocusReason )
2021-05-16 15:16:42 +00:00
}
onClosed: destroy ( )
2021-06-29 12:47:28 +00:00
function isFormValid ( ) {
2021-07-09 10:09:03 +00:00
return Utils . validateAndReturnError ( popup . contentComponent . categoryName . text ,
2021-06-29 12:47:28 +00:00
categoryNameValidator ,
qsTr ( "category name" ) ,
maxCategoryNameLength ) === ""
2021-05-16 15:16:42 +00:00
}
2021-07-09 10:09:03 +00:00
header.title: isEdit ?
2021-05-17 15:05:45 +00:00
qsTr ( "Edit category" ) :
qsTr ( "New category" )
2021-05-16 15:16:42 +00:00
2021-07-09 10:09:03 +00:00
content: ScrollView {
id: scrollView
width: popup . width
height: Math . min ( content . height , 432 )
2021-05-16 15:16:42 +00:00
property ScrollBar vScrollBar: ScrollBar . vertical
2021-07-09 10:09:03 +00:00
property alias categoryName: nameInput
2021-05-16 15:16:42 +00:00
contentHeight: content . height
ScrollBar.horizontal.policy: ScrollBar . AlwaysOff
clip: true
function scrollBackUp ( ) {
vScrollBar . setPosition ( 0 )
}
2021-07-09 10:09:03 +00:00
Column {
2021-05-16 15:16:42 +00:00
id: content
width: parent . width
2021-07-09 10:09:03 +00:00
StatusModalDivider {
bottomPadding: 8
}
2021-05-16 15:16:42 +00:00
2021-07-09 10:09:03 +00:00
Item {
width: parent . width
height: 76
Input {
id: nameInput
width: parent . width - 32
anchors.centerIn: parent
anchors.left: undefined
anchors.right: undefined
placeholderText: qsTr ( "Category title" )
maxLength: maxCategoryNameLength
onTextEdited: {
validationError = Utils . validateAndReturnError ( text ,
categoryNameValidator ,
qsTr ( "category name" ) ,
maxCategoryNameLength )
}
2021-05-16 15:16:42 +00:00
}
}
2021-07-09 10:09:03 +00:00
StatusModalDivider {
topPadding: 8
bottomPadding: 8
2021-05-16 15:16:42 +00:00
}
2021-07-09 10:09:03 +00:00
Item {
anchors.horizontalCenter: parent . horizontalCenter
width: parent . width - 32
height: 34
StatusBaseText {
text: qsTr ( "Channels" )
anchors.bottom: parent . bottom
anchors.bottomMargin: 4
font.pixelSize: 15
color: Theme . palette . baseColor1
}
2021-05-16 15:16:42 +00:00
}
ListView {
2021-05-17 15:05:45 +00:00
id: communityChannelList
2021-05-16 15:16:42 +00:00
height: childrenRect . height
model: chatsModel . communities . activeCommunity . chats
anchors.left: parent . left
anchors.right: parent . right
2021-07-09 10:09:03 +00:00
delegate: StatusListItem {
anchors.horizontalCenter: parent . horizontalCenter
width: parent . width - 32
visible: popup . isEdit ?
model . category === popup . categoryId || model . categoryId === "" :
model . categoryId === ""
title: "#" + model . name
icon.isLetterIdenticon: true
icon.background.color: model . color
sensor.onClicked: channelItemCheckbox . checked = ! channelItemCheckbox . checked
components: [
StatusCheckBox {
id: channelItemCheckbox
checked: popup . isEdit ? channels . indexOf ( model . id ) > - 1 : false
onCheckedChanged: {
var idx = channels . indexOf ( model . id )
if ( checked ) {
if ( idx === - 1 ) {
channels . push ( model . id )
}
} else {
if ( idx > - 1 ) {
channels . splice ( idx , 1 ) ;
}
}
2021-05-16 15:16:42 +00:00
}
}
2021-07-09 10:09:03 +00:00
]
2021-05-16 15:16:42 +00:00
}
}
2021-07-09 10:09:03 +00:00
StatusModalDivider {
visible: deleteCategoryButton . visible
topPadding: 8
bottomPadding: 8
2021-05-17 15:05:45 +00:00
}
2021-07-09 10:09:03 +00:00
StatusListItem {
id: deleteCategoryButton
anchors.horizontalCenter: parent . horizontalCenter
2021-05-18 13:31:18 +00:00
visible: isEdit
2021-05-17 15:05:45 +00:00
2021-07-09 10:09:03 +00:00
title: qsTr ( "Delete category" )
icon.name: "delete"
type: StatusListItem . Type . Danger
sensor.onClicked: {
openPopup ( deleteCategoryConfirmationDialogComponent , {
title: qsTr ( "Delete %1 category" ) . arg ( popup . contentComponent . categoryName . text ) ,
confirmationText: qsTr ( "Are you sure you want to delete %1 category? Channels inside the category won’ t be deleted." ) . arg ( popup . contentComponent . categoryName . text )
} )
2021-05-17 15:05:45 +00:00
}
2021-07-09 10:09:03 +00:00
}
2021-05-17 15:05:45 +00:00
2021-07-09 10:09:03 +00:00
StatusModalDivider {
topPadding: 8
}
2021-05-17 15:05:45 +00:00
2021-07-09 10:09:03 +00:00
Component {
id: deleteCategoryConfirmationDialogComponent
ConfirmationDialog {
btnType: "warn"
height: 216
showCancelButton: true
onClosed: {
destroy ( )
}
onCancelButtonClicked: {
close ( ) ;
}
onConfirmButtonClicked: function ( ) {
const error = chatsModel . communities . deleteCommunityCategory ( chatsModel . communities . activeCommunity . id , popup . categoryId )
if ( error ) {
creatingError . text = error
return creatingError . open ( )
2021-05-17 15:05:45 +00:00
}
2021-07-09 10:09:03 +00:00
close ( ) ;
popup . close ( )
2021-05-17 15:05:45 +00:00
}
}
}
2021-05-16 15:16:42 +00:00
}
}
2021-07-09 10:09:03 +00:00
rightButtons: [
StatusButton {
enabled: isFormValid ( )
text: isEdit ?
qsTr ( "Save" ) :
qsTr ( "Create" )
onClicked: {
if ( ! isFormValid ( ) ) {
scrollView . scrollBackUp ( )
return
}
2021-05-17 15:05:45 +00:00
2021-07-09 10:09:03 +00:00
let error = ""
2021-05-16 15:16:42 +00:00
2021-07-09 10:09:03 +00:00
if ( isEdit ) {
error = chatsModel . communities . editCommunityCategory ( communityId , categoryId , Utils . filterXSS ( nameInput . text ) , JSON . stringify ( channels ) )
} else {
error = chatsModel . communities . createCommunityCategory ( communityId , Utils . filterXSS ( popup . contentComponent . categoryName . text ) , JSON . stringify ( channels ) )
}
2021-05-16 15:16:42 +00:00
2021-07-09 10:09:03 +00:00
if ( error ) {
categoryError . text = error
return categoryError . open ( )
}
2021-05-16 15:16:42 +00:00
2021-07-09 10:09:03 +00:00
popup . close ( )
}
2021-05-16 15:16:42 +00:00
}
2021-07-09 10:09:03 +00:00
]
MessageDialog {
id: categoryError
title: isEdit ?
qsTr ( "Error editing the category" ) :
qsTr ( "Error creating the category" )
icon: StandardIcon . Critical
standardButtons: StandardButton . Ok
2021-05-16 15:16:42 +00:00
}
}