- Align 'Reply' button.
- Do not display 'View chat' as a link: the 'View chat' action is active when
the user clickcs on the notification item in the tray window.
- Convert the QByteArray verb value to String.
- Handle logic to toggle the reply textfield in the QML code.
Signed-off-by: Camila <hello@camila.codes>
property bool isFileActivityList: false
- property bool isChatActivity: model.objectType === "chat" || model.objectType === "room" || model.objectType === "call"
- property bool isTalkReplyPossible: model.conversationToken !== ""
+ readonly property bool isChatActivity: model.objectType === "chat" || model.objectType === "room" || model.objectType === "call"
+ readonly property bool isTalkReplyPossible: model.conversationToken !== ""
+ property bool isTalkReplyOptionVisible: model.messageSent !== ""
signal fileActivityButtonClicked(string absolutePath)
Accessible.name: (model.path !== "" && model.displayPath !== "") ? qsTr("Open %1 locally").arg(model.displayPath) : model.message
Accessible.onPressAction: root.clicked()
+ function showReplyOptions(activityIndex) {
+ isTalkReplyOptionVisible = !isTalkReplyOptionVisible
+ }
+
Rectangle {
id: activityHover
anchors.fill: parent
ActivityItemActions {
id: activityActions
- visible: !root.isFileActivityList && model.linksForActionButtons.length > 0 && !model.displayReplyOption
+ visible: !root.isFileActivityList && model.linksForActionButtons.length > 0 && !isTalkReplyOptionVisible
Layout.preferredHeight: Style.trayWindowHeaderHeight * 0.85
Layout.fillWidth: true
- Layout.leftMargin: 40
+ Layout.leftMargin: 60
Layout.bottomMargin: model.links.length > 1 ? 5 : 0
displayActions: model.displayActions
ActivityActionButton {
id: activityActionButton
- readonly property bool primary: model.index === 0 && model.modelData.verb !== "DELETE"
+ readonly property string verb: model.modelData.verb
+ readonly property bool primary: model.index === 0 && verb !== "DELETE"
+ readonly property bool isViewChatlink: verb === "WEB"
+ readonly property bool isTalkReplyButton: verb === "REPLY"
+
+ visible: !isViewChatlink
Layout.minimumWidth: primary ? Style.activityItemActionPrimaryButtonMinWidth : Style.activityItemActionSecondaryButtonMinWidth
Layout.preferredHeight: primary ? parent.height : parent.height * 0.3
bold: primary
- onClicked: root.triggerAction(model.index)
+ onClicked: !isTalkReplyButton? root.triggerAction(model.index) : showReplyOptions(model.index)
}
}
color: Style.ncSecondaryTextColor
}
+ Label {
+ id: talkReplyMessageSent
+ text: root.activityData.messageSent
+ height: (text === "") ? 0 : implicitHeight
+ width: parent.width
+ elide: Text.ElideRight
+ wrapMode: Text.Wrap
+ maximumLineCount: 2
+ font.pixelSize: Style.topLinePixelSize
+ color: Style.ncSecondaryTextColor
+ }
+
Loader {
id: talkReplyTextFieldLoader
- active: isChatActivity && isTalkReplyPossible && model.displayReplyOption
- visible: model.displayReplyOption
+ active: isChatActivity && isTalkReplyPossible
+ visible: isTalkReplyOptionVisible
anchors.top: activityTextDateTime.bottom
anchors.topMargin: 10
}
UserModel.currentUser.sendReplyMessage(model.index, model.conversationToken, replyMessageTextField.text, model.messageId);
- }
-
- Text {
- id: replyMessageSent
- text: model.messageSent
- font.pixelSize: Style.topLinePixelSize
- color: Style.menuBorder
- visible: model.messageSent !== ""
+ replyMessageTextField.visible = false
}
TextField {
id: replyMessageTextField
+ visible: model.messageSent === ""
// TODO use Layout to manage width/height. The Layout.minimunWidth does not apply to the width set.
height: 38
width: 250
onAccepted: root.sendReplyMessage()
- visible: replyMessageSent.text === ""
topPadding: 4
QString conversationToken;
QString messageId;
QString messageSent;
- bool displayReplyOption = false;
};
Type _type;
-/*
+/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* This program is free software; you can redistribute it and/or modify
roles[TalkNotificationConversationTokenRole] = "conversationToken";
roles[TalkNotificationMessageIdRole] = "messageId";
roles[TalkNotificationMessageSentRole] = "messageSent";
- roles[TalkNotificationDisplayReplyOptionRole] = "displayReplyOption";
return roles;
}
return a._talkNotificationData.messageId;
case TalkNotificationMessageSentRole:
return replyMessageSent(a);
- case TalkNotificationDisplayReplyOptionRole:
- return displayReplyOption(a);
default:
return QVariant();
}
const auto action = activity._links[actionIndex];
- // TODO this will change with https://github.com/nextcloud/desktop/issues/4159
- if (action._verb == "WEB" && action._label == tr("View chat")) {
- setDisplayReplyOption(activityIndex);
- return;
- }
-
if (action._verb == "WEB") {
Utility::openBrowser(QUrl(action._link));
return;
}
if (static_cast<quint32>(activity._links.size()) > maxActionButtons()) {
- customList << ActivityListModel::convertLinkToActionButton(activity, activity._links.first());
+ customList << ActivityListModel::convertLinkToActionButton(activity._links.first());
return customList;
}
if (activityLink._verb == QStringLiteral("DELETE")
|| (activity._objectType == QStringLiteral("chat") || activity._objectType == QStringLiteral("call")
|| activity._objectType == QStringLiteral("room"))) {
- customList << ActivityListModel::convertLinkToActionButton(activity, activityLink);
+ customList << ActivityListModel::convertLinkToActionButton(activityLink);
}
}
return customList;
}
-QVariant ActivityListModel::convertLinkToActionButton(const OCC::Activity &activity, const OCC::ActivityLink &activityLink)
+QVariant ActivityListModel::convertLinkToActionButton(const OCC::ActivityLink &activityLink)
{
auto activityLinkCopy = activityLink;
- const auto isReplyIconApplicable = activityLink._verb == QStringLiteral("WEB")
- && (activity._objectType == QStringLiteral("chat") || activity._objectType == QStringLiteral("call")
- || activity._objectType == QStringLiteral("room"));
+ const auto isReplyIconApplicable = activityLink._verb == QStringLiteral("REPLY");
const QString replyButtonPath = QStringLiteral("image://svgimage-custom-color/reply.svg");
QString(replyButtonPath + "/" + OCC::Theme::instance()->wizardHeaderTitleColor().name());
}
- const auto isReplyLabelApplicable = activityLink._verb == QStringLiteral("WEB")
- && (activity._objectType == QStringLiteral("chat")
- || (activity._objectType != QStringLiteral("room") && activity._objectType != QStringLiteral("call")));
-
if (activityLink._verb == QStringLiteral("DELETE")) {
activityLinkCopy._label = QObject::tr("Mark as read");
- } else if (isReplyLabelApplicable) {
- activityLinkCopy._label = QObject::tr("Reply");
}
return QVariant::fromValue(activityLinkCopy);
{
return activity._talkNotificationData.messageSent;
}
-
-void ActivityListModel::setDisplayReplyOption(const int activityIndex)
-{
- _finalList[activityIndex]._talkNotificationData.displayReplyOption = true;
- emit dataChanged(index(activityIndex, 0), index(activityIndex, 0), {ActivityListModel::TalkNotificationDisplayReplyOptionRole});
-}
-
-bool ActivityListModel::displayReplyOption(const Activity &activity) const
-{
- return activity._talkNotificationData.displayReplyOption;
-}
}
TalkNotificationConversationTokenRole,
TalkNotificationMessageIdRole,
TalkNotificationMessageSentRole,
- TalkNotificationDisplayReplyOptionRole,
};
Q_ENUM(DataRole)
void setReplyMessageSent(const int activityIndex, const QString &message);
QString replyMessageSent(const Activity &activity) const;
- bool displayReplyOption(const Activity &activity) const;
public slots:
void slotRefreshActivity();
private:
static QVariantList convertLinksToMenuEntries(const Activity &activity);
static QVariantList convertLinksToActionButtons(const Activity &activity);
- static QVariant convertLinkToActionButton(const Activity &activity, const ActivityLink &activityLink);
+ static QVariant convertLinkToActionButton(const ActivityLink &activityLink);
void combineActivityLists();
bool canFetchActivities() const;
void ingestActivities(const QJsonArray &activities);
- void setDisplayReplyOption(const int activityIndex);
-
ActivityList _activityLists;
ActivityList _syncFileItemLists;
ActivityList _notificationLists;
bool _doneFetching = false;
bool _hideOldActivities = true;
- static constexpr quint32 MaxActionButtons = 2;
+ static constexpr quint32 MaxActionButtons = 3;
};
}
a._id = json.value("notification_id").toInt();
// 2 cases to consider:
- // - server == 24 & has Talk: notification type chat/call contains conversationToken/messageId in object_type
- // - server < 24 & has Talk: notification type chat/call contains _only_ the conversationToken in object_type
- if (a._objectType == "chat" || a._objectType == "call") {
+ // 1. server == 24 & has Talk: object_type is chat/call/room & object_id contains conversationToken/messageId
+ // 2. server < 24 & has Talk: object_type is chat/call/room & object_id contains _only_ conversationToken
+ if (a._objectType == "chat" || a._objectType == "call" || a._objectType == "room") {
const auto objectId = json.value("object_id").toString();
const auto objectIdData = objectId.split("/");
a._talkNotificationData.conversationToken = objectIdData.first();
} else {
qCInfo(lcServerNotification) << "Replying directly to Talk conversation" << a._talkNotificationData.conversationToken << "will not be possible because the notification doesn't contain the message ID.";
}
+
+ ActivityLink al;
+ al._label = tr("Reply");
+ al._verb = "REPLY";
+ al._primary = true;
+ a._links.insert(0, al);
+
+ list.append(a);
}
a._status = 0;