Warning, file /network/ruqola/src/widgets/administratordialog/rooms/administratorroomswidget.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002    SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "administratorroomswidget.h"
0008 #include "administratorroomseditdialog.h"
0009 #include "channels/channeldeletejob.h"
0010 #include "connection.h"
0011 #include "directmessage/deletedmjob.h"
0012 #include "groups/groupsdeletejob.h"
0013 #include "misc/searchwithdelaylineedit.h"
0014 #include "model/adminroomsmodel.h"
0015 #include "rocketchataccount.h"
0016 #include "rooms/adminroomsgetroomjob.h"
0017 #include "rooms/adminroomsjob.h"
0018 #include "rooms/changearchivationstatejob.h"
0019 
0020 #include "ruqolawidgets_debug.h"
0021 
0022 #include <KLocalizedString>
0023 #include <KMessageBox>
0024 #include <QLabel>
0025 #include <QMenu>
0026 #include <QPointer>
0027 #include <QTreeView>
0028 #include <QVBoxLayout>
0029 
0030 AdministratorRoomsWidget::AdministratorRoomsWidget(RocketChatAccount *account, QWidget *parent)
0031     : SearchTreeBaseWidget(account, parent)
0032     , mSelectRoomType(new AdministratorRoomsSelectRoomTypeWidget(this))
0033 {
0034     mSelectRoomType->setObjectName(QStringLiteral("mSelectRoomType"));
0035     connect(mSelectRoomType, &AdministratorRoomsSelectRoomTypeWidget::filterChanged, this, &AdministratorRoomsWidget::slotFilterChanged);
0036 
0037     mModel = new AdminRoomsModel(this);
0038     mModel->setObjectName(QStringLiteral("mAdminRoomsModel"));
0039 
0040     mProxyModelModel = new AdminRoomsFilterProxyModel(mModel, this);
0041     mProxyModelModel->setObjectName(QStringLiteral("mAdminUsersProxyModel"));
0042     mSearchLineEdit->setPlaceholderText(i18n("Search rooms"));
0043     mTreeView->setModel(mProxyModelModel);
0044     mSearchLayout->addWidget(mSelectRoomType);
0045     hideColumns();
0046     connectModel();
0047     connect(mTreeView, &QTreeView::doubleClicked, this, [this](const QModelIndex &index) {
0048         if (index.isValid()) {
0049             const QModelIndex i = mProxyModelModel->mapToSource(index);
0050             slotModifyRoom(i);
0051         }
0052     });
0053 }
0054 
0055 AdministratorRoomsWidget::~AdministratorRoomsWidget() = default;
0056 
0057 void AdministratorRoomsWidget::slotCustomContextMenuRequested(const QPoint &pos)
0058 {
0059     QMenu menu(this);
0060     const QModelIndex parentIndex = mTreeView->indexAt(pos);
0061     if (parentIndex.isValid()) {
0062         const QModelIndex index = mProxyModelModel->mapToSource(parentIndex);
0063         menu.addAction(QIcon::fromTheme(QStringLiteral("document-edit")), i18n("Modify..."), this, [this, index]() {
0064             slotModifyRoom(index);
0065         });
0066         menu.addSeparator();
0067         menu.addAction(QIcon::fromTheme(QStringLiteral("list-remove")), i18n("Remove"), this, [this, index]() {
0068             slotRemoveRoom(index);
0069         });
0070     }
0071     menu.exec(mTreeView->viewport()->mapToGlobal(pos));
0072 }
0073 
0074 void AdministratorRoomsWidget::updateLabel()
0075 {
0076     mLabelResultSearch->setText(mModel->total() == 0 ? i18n("No room found") : displayShowMessageInRoom());
0077 }
0078 
0079 QString AdministratorRoomsWidget::displayShowMessageInRoom() const
0080 {
0081     QString displayMessageStr = i18np("%1 room (Total: %2)", "%1 rooms (Total: %2)", mModel->rowCount(), mModel->total());
0082     if (!mModel->hasFullList()) {
0083         displayMessageStr += clickableStr();
0084     }
0085     return displayMessageStr;
0086 }
0087 
0088 void AdministratorRoomsWidget::slotGetRoomSettingsModifyDone(const QJsonObject &obj, Room::RoomType roomType)
0089 {
0090     AdministratorRoomsEditDialog::RoomType admRoomType{AdministratorRoomsEditDialog::Unknown};
0091     RoomInfo roomInfo;
0092     roomInfo.parseRoomInfo(obj);
0093     AdministratorRoomsEditBaseWidget::RoomEditInfo info;
0094     info.readOnly = roomInfo.readOnly();
0095     info.featured = roomInfo.featured();
0096     info.defaultRoom = roomInfo.defaultRoom();
0097     info.name = roomInfo.roomName();
0098     if (roomType == Room::RoomType::Direct) {
0099         admRoomType = AdministratorRoomsEditDialog::DirectRoom;
0100     } else {
0101         info.topic = roomInfo.topic();
0102         info.announcement = roomInfo.announcement();
0103         info.description = roomInfo.description();
0104         info.userOwnerName = roomInfo.ownerName();
0105         admRoomType = AdministratorRoomsEditDialog::Channel;
0106     }
0107     QPointer<AdministratorRoomsEditDialog> dlg = new AdministratorRoomsEditDialog(admRoomType, this);
0108     dlg->setRoomEditInfo(info);
0109     if (dlg->exec()) {
0110         AdministratorRoomsEditBaseWidget::RoomEditInfo newInfo = dlg->roomEditInfo();
0111         const QString roomIdentifier = roomInfo.identifier();
0112         const bool oldArchivedValue = info.archived;
0113         const bool newArchivedValue = newInfo.archived;
0114         const RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo saveInfo = convertToSaveRoomSettingsInfo(newInfo, roomType, roomIdentifier);
0115         auto saveRoomSettingsJob = new RocketChatRestApi::SaveRoomSettingsJob(this);
0116         connect(saveRoomSettingsJob,
0117                 &RocketChatRestApi::SaveRoomSettingsJob::saveRoomSettingsDone,
0118                 this,
0119                 [this, oldArchivedValue, newArchivedValue](const QString &roomId) {
0120                     slotSaveRoomSettingsDone(roomId);
0121                     if (newArchivedValue != oldArchivedValue) {
0122                         auto changeArchivationStateJob = new RocketChatRestApi::ChangeArchivationStateJob(this);
0123                         mRocketChatAccount->restApi()->initializeRestApiJob(changeArchivationStateJob);
0124                         changeArchivationStateJob->setArchive(newArchivedValue);
0125                         connect(changeArchivationStateJob, &RocketChatRestApi::ChangeArchivationStateJob::changeArchivationStateDone, this, []() {
0126 
0127                         });
0128                         if (!changeArchivationStateJob->start()) {
0129                             qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start changeArchivationStateJob";
0130                         }
0131                     }
0132                 });
0133         saveRoomSettingsJob->setSaveRoomSettingsInfo(saveInfo);
0134         mRocketChatAccount->restApi()->initializeRestApiJob(saveRoomSettingsJob);
0135         if (!saveRoomSettingsJob->start()) {
0136             qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start saveRoomSettingsJob";
0137         }
0138     }
0139     delete dlg;
0140 }
0141 
0142 void AdministratorRoomsWidget::slotModifyRoom(const QModelIndex &index)
0143 {
0144     const QString roomId = mModel->index(index.row(), AdminRoomsModel::Identifier).data().toString();
0145     const QString channelType = mModel->index(index.row(), AdminRoomsModel::ChannelType).data().toString();
0146     const Room::RoomType roomType = Room::roomTypeFromString(channelType);
0147     auto getRoomSettingsJob = new RocketChatRestApi::AdminRoomsGetRoomJob(this);
0148     getRoomSettingsJob->setRoomId(roomId);
0149     connect(getRoomSettingsJob, &RocketChatRestApi::AdminRoomsGetRoomJob::adminRoomGetRoomDone, this, [this, roomType](const QJsonObject &obj) {
0150         slotGetRoomSettingsModifyDone(obj, roomType);
0151     });
0152     mRocketChatAccount->restApi()->initializeRestApiJob(getRoomSettingsJob);
0153     if (!getRoomSettingsJob->start()) {
0154         qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start AdminRoomsGetRoomJob";
0155     }
0156 }
0157 
0158 void AdministratorRoomsWidget::slotSaveRoomSettingsDone(const QString &roomId)
0159 {
0160     auto getRoomSettingsJob = new RocketChatRestApi::AdminRoomsGetRoomJob(this);
0161     getRoomSettingsJob->setRoomId(roomId);
0162     connect(getRoomSettingsJob, &RocketChatRestApi::AdminRoomsGetRoomJob::adminRoomGetRoomDone, this, &AdministratorRoomsWidget::slotGetRoomSettingsDone);
0163     mRocketChatAccount->restApi()->initializeRestApiJob(getRoomSettingsJob);
0164     if (!getRoomSettingsJob->start()) {
0165         qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start AdminRoomsGetRoomJob";
0166     }
0167 }
0168 
0169 void AdministratorRoomsWidget::slotGetRoomSettingsDone(const QJsonObject &obj)
0170 {
0171     mModel->updateElement(obj);
0172 }
0173 
0174 RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo
0175 AdministratorRoomsWidget::convertToSaveRoomSettingsInfo(const AdministratorRoomsEditBaseWidget::RoomEditInfo &info,
0176                                                         const Room::RoomType roomType,
0177                                                         const QString &roomIdentifier)
0178 {
0179     RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo roomSettingsInfo;
0180     roomSettingsInfo.roomId = roomIdentifier;
0181     roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::Favorite;
0182     roomSettingsInfo.favorite = info.favorite;
0183     roomSettingsInfo.roomType = Room::roomFromRoomType(roomType);
0184     if (roomType == Room::RoomType::Direct) {
0185         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::Featured;
0186         roomSettingsInfo.featured = info.featured;
0187         // mDefaultCheckBox->setChecked(newRoomEditInfo.defaultRoom);
0188         // TODO
0189     } else {
0190         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::RoomName;
0191         roomSettingsInfo.roomName = info.name;
0192         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::ReadOnly;
0193         roomSettingsInfo.readOnly = info.readOnly;
0194         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::RoomAnnouncement;
0195         roomSettingsInfo.roomAnnouncement = info.announcement;
0196         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::RoomDescription;
0197         roomSettingsInfo.roomDescription = info.description;
0198         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::RoomTopic;
0199         roomSettingsInfo.roomTopic = info.topic;
0200         roomSettingsInfo.mSettingsWillBeChanged |= RocketChatRestApi::SaveRoomSettingsJob::SaveRoomSettingsInfo::SettingChanged::DefaultValue;
0201         roomSettingsInfo.defaultValue = info.defaultRoom;
0202     }
0203     return roomSettingsInfo;
0204 }
0205 
0206 void AdministratorRoomsWidget::slotRemoveRoom(const QModelIndex &index)
0207 {
0208     const QString roomName = mModel->index(index.row(), AdminRoomsModel::Name).data().toString();
0209     if (KMessageBox::ButtonCode::PrimaryAction
0210         == KMessageBox::questionTwoActions(this,
0211                                            i18n("Do you want to remove \"%1\"?", roomName),
0212                                            i18nc("@title", "Remove Room"),
0213                                            KStandardGuiItem::remove(),
0214                                            KStandardGuiItem::cancel())) {
0215         const QString roomIdentifier = mModel->index(index.row(), AdminRoomsModel::Identifier).data().toString();
0216         const QString channelType = mModel->index(index.row(), AdminRoomsModel::ChannelType).data().toString();
0217         const Room::RoomType roomType = Room::roomTypeFromString(channelType);
0218         switch (roomType) {
0219         case Room::RoomType::Private: {
0220             auto job = new RocketChatRestApi::GroupsDeleteJob(this);
0221             mRocketChatAccount->restApi()->initializeRestApiJob(job);
0222             RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo info;
0223             info.identifier = roomIdentifier;
0224             info.channelGroupInfoType = RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Identifier;
0225             job->setChannelGroupInfo(info);
0226             connect(job, &RocketChatRestApi::GroupsDeleteJob::deleteGroupsDone, this, &AdministratorRoomsWidget::slotDeleteGroupsDone);
0227             if (!job->start()) {
0228                 qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start GroupsDeleteJob";
0229             }
0230             break;
0231         }
0232         case Room::RoomType::Channel: {
0233             auto job = new RocketChatRestApi::ChannelDeleteJob(this);
0234             mRocketChatAccount->restApi()->initializeRestApiJob(job);
0235             RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo info;
0236             info.channelGroupInfoType = RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Identifier;
0237             info.identifier = roomIdentifier;
0238             job->setChannelGroupInfo(info);
0239             connect(job, &RocketChatRestApi::ChannelDeleteJob::deletechannelDone, this, &AdministratorRoomsWidget::slotDeletechannelDone);
0240             if (!job->start()) {
0241                 qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start ChannelDeleteJob";
0242             }
0243             break;
0244         }
0245         case Room::RoomType::Direct: {
0246             auto job = new RocketChatRestApi::DeleteDmJob(this);
0247             mRocketChatAccount->restApi()->initializeRestApiJob(job);
0248             RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfo info;
0249             info.channelGroupInfoType = RocketChatRestApi::ChannelGroupBaseJob::ChannelGroupInfoType::Identifier;
0250             info.identifier = roomIdentifier;
0251             job->setChannelGroupInfo(info);
0252             connect(job, &RocketChatRestApi::DeleteDmJob::deleteDirectMessagesDone, this, &AdministratorRoomsWidget::slotDeleteDirectMessageDone);
0253             if (!job->start()) {
0254                 qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start ChannelDeleteJob";
0255             }
0256             break;
0257         }
0258         case Room::RoomType::Unknown:
0259             qCWarning(RUQOLAWIDGETS_LOG) << " unsupported delete for type " << channelType;
0260             break;
0261         }
0262     }
0263 }
0264 
0265 void AdministratorRoomsWidget::slotDeleteGroupsDone(const QString &identifier)
0266 {
0267     mModel->removeElement(identifier);
0268 }
0269 
0270 void AdministratorRoomsWidget::slotDeletechannelDone(const QString &identifier)
0271 {
0272     mModel->removeElement(identifier);
0273 }
0274 
0275 void AdministratorRoomsWidget::slotDeleteDirectMessageDone(const QString &identifier)
0276 {
0277     mModel->removeElement(identifier);
0278 }
0279 
0280 void AdministratorRoomsWidget::slotFilterChanged(AdminRoomsFilterProxyModel::FilterRooms filters)
0281 {
0282     static_cast<AdminRoomsFilterProxyModel *>(mProxyModelModel)->setFilterRooms(filters);
0283 }
0284 
0285 void AdministratorRoomsWidget::slotLoadElements(int offset, int count, const QString &searchName)
0286 {
0287     auto job = new RocketChatRestApi::AdminRoomsJob(this);
0288     RocketChatRestApi::AdminRoomsJob::AdminRoomsJobInfo info;
0289     info.filter = searchName;
0290     info.searchType = RocketChatRestApi::AdminRoomsJob::AdminRoomSearchType::All;
0291     job->setRoomsAdminInfo(info);
0292 
0293     RocketChatRestApi::QueryParameters parameters;
0294     QMap<QString, RocketChatRestApi::QueryParameters::SortOrder> map;
0295     map.insert(QStringLiteral("name"), RocketChatRestApi::QueryParameters::SortOrder::Ascendant);
0296     parameters.setSorting(map);
0297     if (offset != -1) {
0298         parameters.setOffset(offset);
0299     }
0300     if (count != -1) {
0301         parameters.setCount(count);
0302     }
0303     job->setQueryParameters(parameters);
0304 
0305     mRocketChatAccount->restApi()->initializeRestApiJob(job);
0306     if (offset != -1) {
0307         connect(job, &RocketChatRestApi::AdminRoomsJob::adminRoomsDone, this, &AdministratorRoomsWidget::slotLoadMoreElementDone);
0308     } else {
0309         connect(job, &RocketChatRestApi::AdminRoomsJob::adminRoomsDone, this, &AdministratorRoomsWidget::slotSearchDone);
0310     }
0311     if (!job->start()) {
0312         qCWarning(RUQOLAWIDGETS_LOG) << "Impossible to start AdminRoomsJob job";
0313     }
0314 }
0315 
0316 #include "moc_administratorroomswidget.cpp"