From: Claudio Cambra Date: Mon, 17 Oct 2022 19:49:12 +0000 (+0200) Subject: Filter out sharees that already have active shares X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~11^2~169^2~6 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=77fb0c4808d41440ef85ac93f6d21eef16a975d7;p=nextcloud-desktop.git Filter out sharees that already have active shares Signed-off-by: Claudio Cambra --- diff --git a/src/gui/filedetails/ShareView.qml b/src/gui/filedetails/ShareView.qml index e28019c07..73e1636f3 100644 --- a/src/gui/filedetails/ShareView.qml +++ b/src/gui/filedetails/ShareView.qml @@ -158,6 +158,7 @@ ColumnLayout { accountState: root.accountState shareItemIsFolder: root.fileDetails && root.fileDetails.isFolder + shareeBlocklist: root.shareModel.sharees onShareeSelected: { root.waitingForSharesToChange = true; diff --git a/src/gui/filedetails/ShareeSearchField.qml b/src/gui/filedetails/ShareeSearchField.qml index eedf20daa..286d27391 100644 --- a/src/gui/filedetails/ShareeSearchField.qml +++ b/src/gui/filedetails/ShareeSearchField.qml @@ -28,10 +28,12 @@ TextField { property var accountState: ({}) property bool shareItemIsFolder: false + property var shareeBlocklist: ({}) property ShareeModel shareeModel: ShareeModel { accountState: root.accountState shareItemIsFolder: root.shareItemIsFolder searchString: root.text + shareeBlocklist: root.shareeBlocklist } readonly property int horizontalPaddingOffset: Style.trayHorizontalMargin diff --git a/src/gui/filedetails/shareemodel.cpp b/src/gui/filedetails/shareemodel.cpp index ea59204f1..2fb9be8f6 100644 --- a/src/gui/filedetails/shareemodel.cpp +++ b/src/gui/filedetails/shareemodel.cpp @@ -145,6 +145,26 @@ void ShareeModel::setLookupMode(const ShareeModel::LookupMode lookupMode) Q_EMIT lookupModeChanged(); } +QVariantList ShareeModel::shareeBlocklist() const +{ + QVariantList returnSharees; + for (const auto &sharee : _shareeBlocklist) { + returnSharees.append(QVariant::fromValue(sharee)); + } + return returnSharees; +} + +void ShareeModel::setShareeBlocklist(const QVariantList shareeBlocklist) +{ + _shareeBlocklist.clear(); + for (const auto &sharee : shareeBlocklist) { + _shareeBlocklist.append(sharee.value()); + } + Q_EMIT shareeBlocklistChanged(); + + filterSharees(); +} + // ------------------------- Internal data methods ------------------------- // void ShareeModel::fetch() @@ -176,7 +196,7 @@ void ShareeModel::shareesFetched(const QJsonDocument &reply) _fetchOngoing = false; Q_EMIT fetchOngoingChanged(); - qCInfo(lcShareeModel) << "SearchString: " << _searchString << "resulted in reply: " << reply; + qCInfo(lcShareeModel) << "Reply: " << reply; QVector newSharees; @@ -190,15 +210,14 @@ void ShareeModel::shareesFetched(const QJsonDocument &reply) const auto shareeJsonObject = sharee.toObject(); const auto parsedSharee = parseSharee(shareeJsonObject); - // Filter sharees that we have already shared with - const auto shareeInBlacklistIt = std::find_if(_shareeBlacklist.cbegin(), - _shareeBlacklist.cend(), + const auto shareeInBlacklistIt = std::find_if(_shareeBlocklist.cbegin(), + _shareeBlocklist.cend(), [&parsedSharee](const ShareePtr &blacklistSharee) { return parsedSharee->type() == blacklistSharee->type() && parsedSharee->shareWith() == blacklistSharee->shareWith(); }); - if (shareeInBlacklistIt != _shareeBlacklist.cend()) { + if (shareeInBlacklistIt != _shareeBlocklist.cend()) { continue; } @@ -232,4 +251,28 @@ ShareePtr ShareeModel::parseSharee(const QJsonObject &data) const return ShareePtr(new Sharee(shareWith, displayName, type)); } +void ShareeModel::filterSharees() +{ + auto it = _sharees.begin(); + + while (it != _sharees.end()) { + const auto sharee = *it; + const auto shareeInBlacklistIt = std::find_if(_shareeBlocklist.cbegin(), _shareeBlocklist.cend(), [&sharee](const ShareePtr &blacklistSharee) { + return sharee->type() == blacklistSharee->type() && + sharee->shareWith() == blacklistSharee->shareWith(); + }); + + if (shareeInBlacklistIt != _shareeBlocklist.end()) { + const auto row = it - _sharees.begin(); + beginRemoveRows({}, row, row); + it = _sharees.erase(it); + endRemoveRows(); + } else { + ++it; + } + } + + Q_EMIT shareesReady(); +} + } diff --git a/src/gui/filedetails/shareemodel.h b/src/gui/filedetails/shareemodel.h index 2ae7846ff..26a0b533e 100644 --- a/src/gui/filedetails/shareemodel.h +++ b/src/gui/filedetails/shareemodel.h @@ -33,6 +33,7 @@ class ShareeModel : public QAbstractListModel Q_PROPERTY(QString searchString READ searchString WRITE setSearchString NOTIFY searchStringChanged) Q_PROPERTY(bool fetchOngoing READ fetchOngoing NOTIFY fetchOngoingChanged) Q_PROPERTY(LookupMode lookupMode READ lookupMode WRITE setLookupMode NOTIFY lookupModeChanged) + Q_PROPERTY(QVariantList shareeBlocklist READ shareeBlocklist WRITE setShareeBlocklist NOTIFY shareeBlocklistChanged) public: enum class LookupMode { @@ -60,6 +61,7 @@ public: [[nodiscard]] QString searchString() const; [[nodiscard]] bool fetchOngoing() const; [[nodiscard]] LookupMode lookupMode() const; + [[nodiscard]] QVariantList shareeBlocklist() const; signals: void accountStateChanged(); @@ -67,20 +69,23 @@ signals: void searchStringChanged(); void fetchOngoingChanged(); void lookupModeChanged(); + void shareeBlocklistChanged(); void shareesReady(); - void displayErrorMessage(int code, const QString &); + void displayErrorMessage(const int code, const QString &message); public slots: void setAccountState(AccountState *accountState); void setShareItemIsFolder(const bool shareItemIsFolder); void setSearchString(const QString &searchString); void setLookupMode(const LookupMode lookupMode); + void setShareeBlocklist(const QVariantList shareeBlocklist); void fetch(); private slots: - void shareesFetched(const QJsonDocument &reply); + void shareesFetched(const QJsonDocument &reply); + void filterSharees(); private: [[nodiscard]] ShareePtr parseSharee(const QJsonObject &data) const; @@ -94,7 +99,7 @@ private: LookupMode _lookupMode = LookupMode::LocalSearch; QVector _sharees; - QVector _shareeBlacklist; + QVector _shareeBlocklist; }; } diff --git a/src/gui/filedetails/sharemodel.cpp b/src/gui/filedetails/sharemodel.cpp index cb6d97b3a..19e603b23 100644 --- a/src/gui/filedetails/sharemodel.cpp +++ b/src/gui/filedetails/sharemodel.cpp @@ -194,9 +194,11 @@ void ShareModel::resetData() _shares.clear(); _fetchOngoing = false; _hasInitialShareFetchCompleted = false; + _sharees.clear(); Q_EMIT fetchOngoingChanged(); Q_EMIT hasInitialShareFetchCompletedChanged(); + Q_EMIT shareesChanged(); endResetModel(); } @@ -403,6 +405,8 @@ void ShareModel::slotAddShare(const SharePtr &share) _shares.append(share); endInsertRows(); + slotAddSharee(share->getShareWith()); + shareModelIndex = index(shareIndex); } @@ -454,6 +458,10 @@ void ShareModel::slotRemoveShareWithId(const QString &shareId) return; } + const auto share = shareIndex.data(ShareModel::ShareRole).value(); + const auto sharee = share->getShareWith(); + slotRemoveSharee(sharee); + beginRemoveRows({}, shareIndex.row(), shareIndex.row()); _shares.removeAt(shareIndex.row()); endRemoveRows(); @@ -469,6 +477,22 @@ void ShareModel::slotServerError(const int code, const QString &message) Q_EMIT serverError(code, message); } +void ShareModel::slotAddSharee(const ShareePtr &sharee) +{ + if(!sharee) { + return; + } + + _sharees.append(sharee); + Q_EMIT shareesChanged(); +} + +void ShareModel::slotRemoveSharee(const ShareePtr &sharee) +{ + _sharees.removeAll(sharee); + Q_EMIT shareesChanged(); +} + QString ShareModel::displayStringForShare(const SharePtr &share) const { if (const auto linkShare = share.objectCast()) { @@ -991,4 +1015,13 @@ bool ShareModel::canShare() const return _maxSharingPermissions & SharePermissionShare; } +QVariantList ShareModel::sharees() const +{ + QVariantList returnSharees; + for (const auto &sharee : _sharees) { + returnSharees.append(QVariant::fromValue(sharee)); + } + return returnSharees; +} + } // namespace OCC diff --git a/src/gui/filedetails/sharemodel.h b/src/gui/filedetails/sharemodel.h index ca431dc32..abb94978b 100644 --- a/src/gui/filedetails/sharemodel.h +++ b/src/gui/filedetails/sharemodel.h @@ -35,6 +35,7 @@ class ShareModel : public QAbstractListModel Q_PROPERTY(bool canShare READ canShare NOTIFY sharePermissionsChanged) Q_PROPERTY(bool fetchOngoing READ fetchOngoing NOTIFY fetchOngoingChanged) Q_PROPERTY(bool hasInitialShareFetchCompleted READ hasInitialShareFetchCompleted NOTIFY hasInitialShareFetchCompletedChanged) + Q_PROPERTY(QVariantList sharees READ sharees NOTIFY shareesChanged) public: enum Roles { @@ -94,6 +95,8 @@ public: [[nodiscard]] bool fetchOngoing() const; [[nodiscard]] bool hasInitialShareFetchCompleted() const; + [[nodiscard]] QVariantList sharees() const; + signals: void localPathChanged(); void accountStateChanged(); @@ -105,6 +108,7 @@ signals: void lockExpireStringChanged(); void fetchOngoingChanged(); void hasInitialShareFetchCompletedChanged(); + void shareesChanged(); void serverError(const int code, const QString &message); void passwordSetError(const QString &shareId, const int code, const QString &message); @@ -159,6 +163,8 @@ private slots: void slotAddShare(const SharePtr &share); void slotRemoveShareWithId(const QString &shareId); void slotSharesFetched(const QList &shares); + void slotAddSharee(const ShareePtr &sharee); + void slotRemoveSharee(const ShareePtr &sharee); void slotSharePermissionsSet(const QString &shareId); void slotSharePasswordSet(const QString &shareId); @@ -201,6 +207,7 @@ private: QVector _shares; QHash _shareIdIndexHash; QHash _shareIdRecentlySetPasswords; + QVector _sharees; }; } // namespace OCC