File activity dialog now works for all file actions activities (e.g. deleted files)
authorClaudio Cambra <claudio.cambra@gmail.com>
Sat, 5 Mar 2022 12:44:03 +0000 (13:44 +0100)
committerClaudio Cambra <claudio.cambra@gmail.com>
Wed, 16 Mar 2022 07:38:14 +0000 (08:38 +0100)
Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
12 files changed:
src/gui/fileactivitylistmodel.cpp
src/gui/fileactivitylistmodel.h
src/gui/socketapi/socketapi.cpp
src/gui/socketapi/socketapi.h
src/gui/systray.h
src/gui/tray/ActivityList.qml
src/gui/tray/Window.qml
src/gui/tray/activitydata.h
src/gui/tray/activitylistmodel.cpp
src/gui/tray/activitylistmodel.h
src/gui/tray/usermodel.cpp
test/testactivitylistmodel.cpp

index 104ff317c29112156d407d23374f08737304cbad..ee7360ef22e9288582cf3a0ea4dc455010a00e9c 100644 (file)
@@ -26,7 +26,7 @@ FileActivityListModel::FileActivityListModel(QObject *parent)
     setDisplayActions(false);
 }
 
-void FileActivityListModel::load(AccountState *accountState, const QString &localPath)
+void FileActivityListModel::load(AccountState *accountState, const int objectId)
 {
     Q_ASSERT(accountState);
     if (!accountState || currentlyFetching()) {
@@ -34,18 +34,7 @@ void FileActivityListModel::load(AccountState *accountState, const QString &loca
     }
     setAccountState(accountState);
 
-    const auto folder = FolderMan::instance()->folderForPath(localPath);
-    if (!folder) {
-        return;
-    }
-
-    const auto file = folder->fileFromLocalPath(localPath);
-    SyncJournalFileRecord fileRecord;
-    if (!folder->journalDb()->getFileRecord(file, &fileRecord) || !fileRecord.isValid()) {
-        return;
-    }
-
-    _fileId = fileRecord._fileId;
+    _objectId = objectId;
     slotRefreshActivity();
 }
 
@@ -64,7 +53,7 @@ void FileActivityListModel::startFetchJob()
     QUrlQuery params;
     params.addQueryItem(QStringLiteral("sort"), QStringLiteral("asc"));
     params.addQueryItem(QStringLiteral("object_type"), "files");
-    params.addQueryItem(QStringLiteral("object_id"), _fileId);
+    params.addQueryItem(QStringLiteral("object_id"), QString::number(_objectId));
     job->addQueryParams(params);
     setDoneFetching(true);
     setHideOldActivities(true);
index 421c5812861862290adec8adfff9e54577f57308..2c698ddde34fec8ead972bb984fe3241224cb0e8 100644 (file)
@@ -27,12 +27,12 @@ public:
     explicit FileActivityListModel(QObject *parent = nullptr);
 
 public slots:
-    void load(AccountState *accountState, const QString &fileId);
+    void load(AccountState *accountState, const int objectId);
 
 protected:
     void startFetchJob() override;
 
 private:
-    QString _fileId;
+    int _objectId;
 };
 }
index 6eaa3a6b515a062bf983a116b534bdbb0da1282b..88d8e28520d7a14767538c9cb390a0c401e5ed98 100644 (file)
@@ -497,7 +497,7 @@ void SocketApi::broadcastMessage(const QString &msg, bool doWait)
 void SocketApi::processFileActivityRequest(const QString &localFile)
 {
     const auto fileData = FileData::get(localFile);
-    emit fileActivityCommandReceived(fileData.serverRelativePath, fileData.localPath);
+    emit fileActivityCommandReceived(fileData.serverRelativePath, fileData.journalRecord().numericFileId().toInt());
 }
 
 void SocketApi::processShareRequest(const QString &localFile, SocketListener *listener, ShareDialogStartPage startPage)
index 5183985b581152158282ba4f16633261a0d950f3..112527bb374510fbbc834ffc41bc318f9e03e92f 100644 (file)
@@ -64,7 +64,7 @@ public slots:
 
 signals:
     void shareCommandReceived(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage);
-    void fileActivityCommandReceived(const QString &sharePath, const QString &localPath);
+    void fileActivityCommandReceived(const QString &objectName, const int objectId);
 
 private slots:
     void slotNewConnection();
index 6b63d6797cb6303d38438884b8767781bae2e040..a4a6cbc6472b6d2fa1f7b44b8fd91ff4538c6119 100644 (file)
@@ -90,7 +90,7 @@ signals:
     void hideWindow();
     void showWindow();
     void openShareDialog(const QString &sharePath, const QString &localPath);
-    void showFileActivityDialog(const QString &sharePath, const QString &localPath);
+    void showFileActivityDialog(const QString &objectName, const int objectId);
 
 public slots:
     void slotNewUserSelected();
index ced4ad2d61ab482caa5317a03f4a8494aa083d23..fe66267f9934f38ab3f9532be675cce91a8668bc 100644 (file)
@@ -9,7 +9,7 @@ ScrollView {
 
     property bool isFileActivityList: false
 
-    signal showFileActivity(string displayPath, string absolutePath)
+    signal showFileActivity(string objectName, int objectId)
     signal activityItemClicked(int index)
 
     contentWidth: availableWidth
@@ -39,7 +39,7 @@ ScrollView {
             flickable: activityList
             onClicked: {
                 if (model.isCurrentUserFileActivity) {
-                    showFileActivity(model.displayPath, model.absolutePath)
+                    showFileActivity(model.objectName, model.objectId)
                 } else {
                     activityItemClicked(model.index)
                 }
index 262e55920f72c05a8a8843efc0a13c5bbe446edc..fdf1d51c62ab3e6e26eeffafa71b9b46d5d1c8cc 100644 (file)
@@ -23,13 +23,13 @@ Window {
     flags:      Systray.useNormalWindow ? Qt.Window : Qt.Dialog | Qt.FramelessWindowHint\r
 \r
 \r
-    property var fileActivityDialogAbsolutePath: ""\r
+    property int fileActivityDialogObjectId: -1\r
     readonly property int maxMenuHeight: Style.trayWindowHeight - Style.trayWindowHeaderHeight - 2 * Style.trayWindowBorderWidth\r
 \r
-    function openFileActivityDialog(displayPath, absolutePath) {\r
-        fileActivityDialogLoader.displayPath = displayPath\r
-        fileActivityDialogLoader.absolutePath = absolutePath\r
-        fileActivityDialogLoader.refresh()\r
+    function openFileActivityDialog(objectName, objectId) {\r
+        fileActivityDialogLoader.objectName = objectName;\r
+        fileActivityDialogLoader.objectId = objectId;\r
+        fileActivityDialogLoader.refresh();\r
     }\r
 \r
     Component.onCompleted: Systray.forceWindowInit(trayWindow)\r
@@ -81,8 +81,8 @@ Window {
             Systray.setClosed();\r
         }\r
 \r
-        function onShowFileActivityDialog(displayPath, absolutePath) {\r
-            openFileActivityDialog(displayPath, absolutePath)\r
+        function onShowFileActivityDialog(objectName, objectId) {\r
+            openFileActivityDialog(objectName, objectId)\r
         }\r
     }\r
 \r
@@ -745,7 +745,7 @@ Window {
             activeFocusOnTab: true\r
             model: activityModel\r
             onShowFileActivity: {\r
-                openFileActivityDialog(displayPath, absolutePath)\r
+                openFileActivityDialog(objectName, objectId)\r
             }\r
             onActivityItemClicked: {\r
                 model.slotTriggerDefaultAction(index)\r
@@ -755,18 +755,18 @@ Window {
         Loader {\r
             id: fileActivityDialogLoader\r
 \r
-            property string displayPath: ""\r
-            property string absolutePath: ""\r
+            property string objectName: ""\r
+            property int objectId: -1\r
 \r
             function refresh() {\r
                 active = true\r
-                item.model.load(activityModel.accountState, absolutePath)\r
+                item.model.load(activityModel.accountState, objectId)\r
                 item.show()\r
             }\r
 \r
             active: false\r
             sourceComponent: FileActivityDialog {\r
-                title: qsTr("%1 - File activity").arg(fileActivityDialogLoader.displayPath)\r
+                title: qsTr("%1 - File activity").arg(fileActivityDialogLoader.objectName)\r
                 onClosing: fileActivityDialogLoader.active = false\r
             }\r
 \r
index 31114e115f691a41c021fcc865fc9ff7b3f03456..49ffd5f3b903298cb745f0d455c505731da02940 100644 (file)
@@ -80,7 +80,9 @@ public:
     Type _type;
     qlonglong _id;
     QString _fileAction;
+    int _objectId;
     QString _objectType;
+    QString _objectName;
     QString _subject;
     QString _subjectRich;
     QHash<QString, RichSubjectParameter> _subjectRichParameters;
index ef0546f38f9277f8112f25190c428f91bd7fe2b2..a67f8aa94a852d826f625bc040346fc2b6408fed 100644 (file)
@@ -57,7 +57,6 @@ QHash<int, QByteArray> ActivityListModel::roleNames() const
     auto roles = QAbstractListModel::roleNames();
     roles[DisplayPathRole] = "displayPath";
     roles[PathRole] = "path";
-    roles[AbsolutePathRole] = "absolutePath";
     roles[DisplayLocationRole] = "displayLocation";
     roles[LinkRole] = "link";
     roles[MessageRole] = "message";
@@ -69,6 +68,8 @@ QHash<int, QByteArray> ActivityListModel::roleNames() const
     roles[ActionsLinksForActionButtonsRole] = "linksForActionButtons";
     roles[ActionTextColorRole] = "activityTextTitleColor";
     roles[ObjectTypeRole] = "objectType";
+    roles[ObjectIdRole] = "objectId";
+    roles[ObjectNameRole] = "objectName";
     roles[PointInTimeRole] = "dateTime";
     roles[DisplayActions] = "displayActions";
     roles[ShareableRole] = "isShareable";
@@ -179,8 +180,6 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
         return getDisplayPath();
     case PathRole:
         return QFileInfo(getFilePath()).path();
-    case AbsolutePathRole:
-        return getFilePath();
     case DisplayLocationRole:
         return displayLocation();
     case ActionsLinksRole: {
@@ -239,6 +238,10 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
     }
     case ObjectTypeRole:
         return a._objectType;
+    case ObjectIdRole:
+        return a._objectId;
+    case ObjectNameRole:
+        return a._objectName;
     case ActionRole: {
         switch (a._type) {
         case Activity::ActivityType:
@@ -371,6 +374,8 @@ void ActivityListModel::activitiesReceived(const QJsonDocument &json, int status
         const auto activityUser = json.value(QStringLiteral("user")).toString();
         a._type = Activity::ActivityType;
         a._objectType = json.value(QStringLiteral("object_type")).toString();
+        a._objectId = json.value(QStringLiteral("object_id")).toInt();
+        a._objectName = json.value(QStringLiteral("object_name")).toString();
         a._accName = ast->account()->displayName();
         a._id = json.value(QStringLiteral("activity_id")).toInt();
         a._fileAction = json.value(QStringLiteral("type")).toString();
index 34c591c2f7692cdea8814d93742136f49a423b6c..126ecc28ebe8f459fd73386b55c4ce29d2c383e7 100644 (file)
@@ -48,6 +48,8 @@ public:
         ActionIconRole = Qt::UserRole + 1,
         AccountRole,
         ObjectTypeRole,
+        ObjectIdRole,
+        ObjectNameRole,
         ActionsLinksRole,
         ActionsLinksContextMenuRole,
         ActionsLinksForActionButtonsRole,
@@ -57,7 +59,6 @@ public:
         MessageRole,
         DisplayPathRole,
         PathRole,
-        AbsolutePathRole,
         DisplayLocationRole, // Provides the display path to a file's parent folder, relative to Nextcloud root
         LinkRole,
         PointInTimeRole,
index 44e9f1a0a9d299054c1ab9c5ca5ff81310a0f77c..8adae36820be8252f7f0268cfe819518dc083241 100644 (file)
@@ -505,6 +505,8 @@ void User::processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr
     activity._file = item->_file;
     activity._folder = folder->alias();
     activity._fileAction = "";
+    activity._objectId = item->_fileId.toInt();
+    activity._objectName = item->_file;
 
     const auto fileName = QFileInfo(item->_originalFile).fileName();
 
index 64158822fe9ad4ac4c1d343037be68779400a105..fd521f40699d797b29fb76956a5c38c33ef20a60 100644 (file)
@@ -596,12 +596,14 @@ private slots:
             const auto type = index.data(OCC::ActivityListModel::ActionRole).toInt();
             QVERIFY(type >= OCC::Activity::ActivityType);
 
-            QVERIFY(!index.data(OCC::ActivityListModel::ObjectTypeRole).toInt());
             QVERIFY(!index.data(OCC::ActivityListModel::AccountRole).toString().isEmpty());
             QVERIFY(!index.data(OCC::ActivityListModel::ActionTextColorRole).toString().isEmpty());
             QVERIFY(!index.data(OCC::ActivityListModel::ActionIconRole).toString().isEmpty());
             QVERIFY(!index.data(OCC::ActivityListModel::PointInTimeRole).toString().isEmpty());
 
+            QVERIFY(index.data(OCC::ActivityListModel::ObjectTypeRole).canConvert<int>());
+            QVERIFY(index.data(OCC::ActivityListModel::ObjectNameRole).canConvert<QString>());
+            QVERIFY(index.data(OCC::ActivityListModel::ObjectIdRole).canConvert<int>());
             QVERIFY(index.data(OCC::ActivityListModel::ActionsLinksRole).canConvert<QList<QVariant>>());
             QVERIFY(index.data(OCC::ActivityListModel::ActionTextRole).canConvert<QString>());
             QVERIFY(index.data(OCC::ActivityListModel::MessageRole).canConvert<QString>());