diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index a717cb31..55860ad6 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -7,6 +7,7 @@ import "./components"
import "./delegates"
import "./emoji"
import "./ui"
+import "./dialogs"
import Qt.labs.platform 1.1 as Platform
import QtQuick 2.15
import QtQuick.Controls 2.15
@@ -585,6 +586,21 @@ Item {
open();
}
+ Component {
+ id: removeReason
+ InputDialog {
+ id: removeReasonDialog
+
+ property string eventId
+
+ title: qsTr("Reason for removal")
+ prompt: qsTr("Enter reason for removal or hit enter for no reason:")
+ onAccepted: function(text) {
+ room.redactEvent(eventId, text);
+ }
+ }
+ }
+
Platform.MenuItem {
visible: messageContextMenu.text
enabled: visible
@@ -665,7 +681,13 @@ Item {
Platform.MenuItem {
visible: (room ? room.permissions.canRedact() : false) || messageContextMenu.isSender
text: qsTr("Remo&ve message")
- onTriggered: room.redactEvent(messageContextMenu.eventId)
+ onTriggered: function() {
+ var dialog = removeReason.createObject(timelineRoot);
+ dialog.eventId = messageContextMenu.eventId;
+ dialog.show();
+ dialog.forceActiveFocus();
+ timelineRoot.destroyOnClose(dialog);
+ }
}
Platform.MenuItem {
diff --git a/resources/qml/dialogs/InputDialog.qml b/resources/qml/dialogs/InputDialog.qml
index cf1474dc..a674c3fb 100644
--- a/resources/qml/dialogs/InputDialog.qml
+++ b/resources/qml/dialogs/InputDialog.qml
@@ -21,6 +21,10 @@ ApplicationWindow {
width: 350
height: fontMetrics.lineSpacing * 7
+ function forceActiveFocus() {
+ statusInput.forceActiveFocus();
+ }
+
Shortcut {
sequence: StandardKey.Cancel
onActivated: dbb.rejected()
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index cdaf7260..3743eae0 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -785,11 +785,18 @@ ChatPage::kickUser(QString userid, QString reason)
{
auto room = currentRoom();
- if (QMessageBox::question(nullptr,
- tr("Confirm kick"),
- tr("Do you really want to kick %1 (%2)?")
- .arg(cache::displayName(room, userid), userid)) != QMessageBox::Yes)
+ bool confirmed;
+ reason =
+ QInputDialog::getText(nullptr,
+ tr("Reason for the kick"),
+ tr("Enter reason for kicking %1 (%2) or hit enter for no reason:")
+ .arg(cache::displayName(room, userid), userid),
+ QLineEdit::Normal,
+ reason,
+ &confirmed);
+ if (!confirmed) {
return;
+ }
http::client()->kick_user(
room.toStdString(),
@@ -809,12 +816,18 @@ ChatPage::banUser(QString userid, QString reason)
{
auto room = currentRoom();
- if (QMessageBox::question(
- nullptr,
- tr("Confirm ban"),
- tr("Do you really want to ban %1 (%2)?").arg(cache::displayName(room, userid), userid)) !=
- QMessageBox::Yes)
+ bool confirmed;
+ reason =
+ QInputDialog::getText(nullptr,
+ tr("Reason for the ban"),
+ tr("Enter reason for banning %1 (%2) or hit enter for no reason:")
+ .arg(cache::displayName(room, userid), userid),
+ QLineEdit::Normal,
+ reason,
+ &confirmed);
+ if (!confirmed) {
return;
+ }
http::client()->ban_user(
room.toStdString(),
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 903f137f..8e6c7235 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -1240,7 +1240,7 @@ TimelineModel::showReadReceipts(QString id)
}
void
-TimelineModel::redactEvent(const QString &id)
+TimelineModel::redactEvent(const QString &id, const QString &reason)
{
if (!id.isEmpty()) {
auto edits = events.edits(id.toStdString());
@@ -1255,7 +1255,8 @@ TimelineModel::redactEvent(const QString &id)
}
emit dataAtIdChanged(id);
- });
+ },
+ reason.toStdString());
// redact all edits to prevent leaks
for (const auto &e : edits) {
@@ -1271,7 +1272,8 @@ TimelineModel::redactEvent(const QString &id)
}
emit dataAtIdChanged(id);
- });
+ },
+ reason.toStdString());
}
}
}
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index e4e3fa9d..f47203f0 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -272,7 +272,7 @@ public:
Q_INVOKABLE void unpin(const QString &id);
Q_INVOKABLE void pin(const QString &id);
Q_INVOKABLE void showReadReceipts(QString id);
- Q_INVOKABLE void redactEvent(const QString &id);
+ Q_INVOKABLE void redactEvent(const QString &id, const QString &reason = "");
Q_INVOKABLE int idToIndex(const QString &id) const;
Q_INVOKABLE QString indexToId(int index) const;
Q_INVOKABLE void openMedia(const QString &eventId);
|