Allow adding a reason for deleting messages

BUG: 458911
This commit is contained in:
Tobias Fella
2022-11-18 00:56:12 +01:00
parent a695c31b2b
commit d70f77f622
7 changed files with 74 additions and 13 deletions

View File

@@ -864,9 +864,9 @@ QString NeoChatRoom::htmlSafeDisplayName() const
return displayName().toHtmlEscaped(); return displayName().toHtmlEscaped();
} }
void NeoChatRoom::deleteMessagesByUser(const QString &user) void NeoChatRoom::deleteMessagesByUser(const QString &user, const QString &reason)
{ {
doDeleteMessagesByUser(user); doDeleteMessagesByUser(user, reason);
} }
QString NeoChatRoom::joinRule() const QString NeoChatRoom::joinRule() const
@@ -888,7 +888,7 @@ void NeoChatRoom::setJoinRule(const QString &joinRule)
// Not emitting joinRuleChanged() here, since that would override the change in the UI with the *current* value, which is not the *new* value. // Not emitting joinRuleChanged() here, since that would override the change in the UI with the *current* value, which is not the *new* value.
} }
QCoro::Task<void> NeoChatRoom::doDeleteMessagesByUser(const QString &user) QCoro::Task<void> NeoChatRoom::doDeleteMessagesByUser(const QString &user, QString reason)
{ {
QStringList events; QStringList events;
for (const auto &event : messageEvents()) { for (const auto &event : messageEvents()) {
@@ -897,7 +897,7 @@ QCoro::Task<void> NeoChatRoom::doDeleteMessagesByUser(const QString &user)
} }
} }
for (const auto &e : events) { for (const auto &e : events) {
auto job = connection()->callApi<RedactEventJob>(id(), QUrl::toPercentEncoding(e), connection()->generateTxnId()); auto job = connection()->callApi<RedactEventJob>(id(), QUrl::toPercentEncoding(e), connection()->generateTxnId(), reason);
co_await qCoro(job, &BaseJob::finished); co_await qCoro(job, &BaseJob::finished);
if (job->error() != BaseJob::Success) { if (job->error() != BaseJob::Success) {
qWarning() << "Error: \"" << job->error() << "\" while deleting messages. Aborting"; qWarning() << "Error: \"" << job->error() << "\" while deleting messages. Aborting";

View File

@@ -221,7 +221,7 @@ private:
void onAddHistoricalTimelineEvents(rev_iter_t from) override; void onAddHistoricalTimelineEvents(rev_iter_t from) override;
void onRedaction(const Quotient::RoomEvent &prevEvent, const Quotient::RoomEvent &after) override; void onRedaction(const Quotient::RoomEvent &prevEvent, const Quotient::RoomEvent &after) override;
QCoro::Task<void> doDeleteMessagesByUser(const QString &user); QCoro::Task<void> doDeleteMessagesByUser(const QString &user, QString reason);
QCoro::Task<void> doUploadFile(QUrl url, QString body = QString()); QCoro::Task<void> doUploadFile(QUrl url, QString body = QString());
QString m_chatBoxText; QString m_chatBoxText;
@@ -279,5 +279,5 @@ public Q_SLOTS:
void addLocalAlias(const QString &alias); void addLocalAlias(const QString &alias);
void removeLocalAlias(const QString &alias); void removeLocalAlias(const QString &alias);
void toggleReaction(const QString &eventId, const QString &reaction); void toggleReaction(const QString &eventId, const QString &reaction);
void deleteMessagesByUser(const QString &user); void deleteMessagesByUser(const QString &user, const QString &reason);
}; };

View File

@@ -134,11 +134,15 @@ Kirigami.OverlaySheet {
visible: user === room.localUser || room.canSendState("redact") visible: user === room.localUser || room.canSendState("redact")
action: Kirigami.Action { action: Kirigami.Action {
text: i18n("Delete recent messages by this user") text: i18n("Remove recent messages by this user")
icon.name: "delete" icon.name: "delete"
icon.color: Kirigami.Theme.negativeTextColor icon.color: Kirigami.Theme.negativeTextColor
onTriggered: { onTriggered: {
room.deleteMessagesByUser(user.id) applicationWindow().pageStack.pushDialogLayer("qrc:/RemoveSheet.qml", {room: root.room, userId: user.id}, {
title: i18nc("@title", "Remove Messages"),
width: Kirigami.Units.gridUnit * 25
})
root.close()
} }
} }
} }

View File

@@ -60,10 +60,10 @@ MessageDelegateContextMenu {
text: i18n("Remove") text: i18n("Remove")
icon.name: "edit-delete-remove" icon.name: "edit-delete-remove"
icon.color: "red" icon.color: "red"
onTriggered: { onTriggered: applicationWindow().pageStack.pushDialogLayer("qrc:/RemoveSheet.qml", {room: currentRoom, eventId: eventId}, {
currentRoom.redactEvent(eventId); title: i18nc("@title", "Remove Message"),
root.closeFullscreen() width: Kirigami.Units.gridUnit * 25
} })
}, },
Kirigami.Action { Kirigami.Action {
text: i18nc("@action:button 'Report' as in 'Report this event to the administrators'", "Report") text: i18nc("@action:button 'Report' as in 'Report this event to the administrators'", "Report")

View File

@@ -46,7 +46,10 @@ Loader {
text: i18n("Remove") text: i18n("Remove")
icon.name: "edit-delete-remove" icon.name: "edit-delete-remove"
icon.color: "red" icon.color: "red"
onTriggered: currentRoom.redactEvent(eventId); onTriggered: applicationWindow().pageStack.pushDialogLayer("qrc:/RemoveSheet.qml", {room: currentRoom, eventId: eventId}, {
title: i18nc("@title", "Remove Message"),
width: Kirigami.Units.gridUnit * 25
})
}, },
Kirigami.Action { Kirigami.Action {
text: i18n("Copy") text: i18n("Copy")

View File

@@ -0,0 +1,53 @@
// SPDX-FileCopyrightText: 2022 Tobias Fella <fella@posteo.de>
// SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick 2.15
import QtQuick.Controls 2.15 as QQC2
import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami
Kirigami.Page {
id: deleteSheet
property var room
property string eventId
property string userId: ""
title: userId.length > 0 ? i18n("Remove Messages") : i18n("Remove Message")
QQC2.TextArea {
id: reason
placeholderText: userId.length > 0 ? i18n("Reason for removing this user's recent messages") : i18n("Reason for removing this message")
anchors.fill: parent
wrapMode: TextEdit.Wrap
}
footer: QQC2.ToolBar {
QQC2.DialogButtonBox {
anchors.fill: parent
Item {
Layout.fillWidth: true
}
QQC2.Button {
text: i18nc("@action:button 'Remove' as in 'Remove this message'", "Remove")
icon.name: "delete"
QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.AcceptRole
onClicked: {
if (deleteSheet.userId.length > 0) {
deleteSheet.room.deleteMessagesByUser(deleteSheet.userId, reason.text)
} else {
deleteSheet.room.redactEvent(deleteSheet.eventId, reason.text);
}
deleteSheet.closeDialog()
}
}
QQC2.Button {
text: i18nc("@action", "Cancel")
QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.RejectRole
onClicked: deleteSheet.closeDialog()
}
}
}
}

View File

@@ -91,5 +91,6 @@
<file alias="NetworkProxyPage.qml">qml/Settings/NetworkProxyPage.qml</file> <file alias="NetworkProxyPage.qml">qml/Settings/NetworkProxyPage.qml</file>
<file alias="DevtoolsPage.qml">qml/Page/DevtoolsPage.qml</file> <file alias="DevtoolsPage.qml">qml/Page/DevtoolsPage.qml</file>
<file alias="ConfirmEncryptionDialog.qml">qml/Dialog/ConfirmEncryptionDialog.qml</file> <file alias="ConfirmEncryptionDialog.qml">qml/Dialog/ConfirmEncryptionDialog.qml</file>
<file alias="RemoveSheet.qml">qml/Menu/Timeline/RemoveSheet.qml</file>
</qresource> </qresource>
</RCC> </RCC>