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"