Display action button for conflict files in activity
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 5 Dec 2022 12:54:11 +0000 (13:54 +0100)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Wed, 25 Jan 2023 15:37:35 +0000 (16:37 +0100)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/tray/ActivityItem.qml
src/gui/tray/activitylistmodel.cpp
src/gui/tray/activitylistmodel.h
src/gui/tray/usermodel.cpp

index ebbac6e5a24ca477c4a7de89d93b3a23730f4528..e4705562f5122e448673c7506ecd84a1587e2da5 100644 (file)
@@ -45,7 +45,7 @@ ItemDelegate {
             Layout.fillWidth: true
             Layout.minimumHeight: Style.minActivityHeight
 
-            showDismissButton: model.links.length > 0
+            showDismissButton: model.isDismissable
 
             iconSize: root.iconSize
 
index 837ce46bf02cbddf1c07aca775ec9e4fb30dc710..e41b88b035feba890b02201de68654a68b2a84ff 100644 (file)
@@ -73,6 +73,8 @@ QHash<int, QByteArray> ActivityListModel::roleNames() const
     roles[PointInTimeRole] = "dateTime";
     roles[DisplayActions] = "displayActions";
     roles[ShowFileDetailsRole] = "showFileDetails";
+    roles[ShareableRole] = "isShareable";
+    roles[DismissableRole] = "isDismissable";
     roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity";
     roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity";
     roles[ThumbnailRole] = "thumbnail";
@@ -344,6 +346,12 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
                 _displayActions &&
                 a._fileAction != "file_deleted" &&
                 a._syncFileItemStatus != SyncFileItem::FileIgnored;
+    case DismissableRole:
+        // Do not allow dismissal of things requiring user input regarding syncing
+        return !a._links.isEmpty() &&
+                a._syncFileItemStatus != SyncFileItem::FileNameClash &&
+                a._syncFileItemStatus != SyncFileItem::Conflict &&
+                a._syncFileItemStatus != SyncFileItem::FileNameInvalid;
     case IsCurrentUserFileActivityRole:
         return a._isCurrentUserFileActivity;
     case ThumbnailRole: {
@@ -741,6 +749,11 @@ void ActivityListModel::slotTriggerAction(const int activityIndex, const int act
     if (action._verb == "WEB") {
         Utility::openBrowser(QUrl(action._link));
         return;
+    } else if (action._verb == "FIX_CONFLICT_LOCALLY" &&
+               activity._type == Activity::SyncFileItemType &&
+               (activity._syncFileItemStatus == SyncFileItem::Conflict || activity._syncFileItemStatus == SyncFileItem::FileNameClash)) {
+        slotTriggerDefaultAction(activityIndex);
+        return;
     }
 
     emit sendNotificationRequest(activity._accName, action._link, action._verb, activityIndex);
@@ -768,10 +781,6 @@ QVariantList ActivityListModel::convertLinksToActionButtons(const Activity &acti
 {
     QVariantList customList;
 
-    if (activity._links.size() == 1) {
-        return customList;
-    }
-
     if (static_cast<quint32>(activity._links.size()) > maxActionButtons()) {
         customList << ActivityListModel::convertLinkToActionButton(activity._links.first());
         return customList;
index a1dce834196e31cec4c3a4a8098cd03e72bd415e..3e21ebd1162f76ce263f9db984d41ff14adf0831 100644 (file)
@@ -67,6 +67,8 @@ public:
         AccountConnectedRole,
         DisplayActions,
         ShowFileDetailsRole,
+        ShareableRole,
+        DismissableRole,
         IsCurrentUserFileActivityRole,
         ThumbnailRole,
         TalkNotificationConversationTokenRole,
index f55e1fefc7a3718c5b10eb883f3cf442ae9648e3..cc702e114d07bce4ebd737ff4f24b9e61e6915dd 100644 (file)
@@ -595,6 +595,16 @@ void User::slotAddErrorToGui(const QString &folderAlias, SyncFileItem::Status st
         activity._accName = folderInstance->accountState()->account()->displayName();
         activity._folder = folderAlias;
 
+        if (status == SyncFileItem::Conflict || status == SyncFileItem::FileNameClash) {
+            ActivityLink buttonActivityLink;
+            buttonActivityLink._label = tr("Resolve conflict");
+            buttonActivityLink._link = activity._link.toString();
+            buttonActivityLink._verb = "FIX_CONFLICT_LOCALLY";
+            buttonActivityLink._primary = true;
+
+            activity._links = {buttonActivityLink};
+        }
+
         // Error notifications don't have ids by themselves so we will create one for it
         activity._id = -static_cast<int>(qHash(activity._subject + activity._message));
 
@@ -708,6 +718,14 @@ void User::processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr
             // add 'protocol error' to activity list
             if (item->_status == SyncFileItem::Status::FileNameInvalid) {
                 showDesktopNotification(item->_file, activity._subject, activity._id);
+            } else if (item->_status == SyncFileItem::Conflict || item->_status == SyncFileItem::FileNameClash) {
+                ActivityLink buttonActivityLink;
+                buttonActivityLink._label = tr("Resolve conflict");
+                buttonActivityLink._link = activity._link.toString();
+                buttonActivityLink._verb = "FIX_CONFLICT_LOCALLY";
+                buttonActivityLink._primary = true;
+
+                activity._links = {buttonActivityLink};
             }
             _activityModel->addErrorToActivityList(activity);
         }