mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-26 23:28:14 +03:00
[Sharing] Allow sharing with users/groups from desktop
This commit is contained in:
parent
6fb4e59120
commit
90cbd461ab
7 changed files with 126 additions and 145 deletions
|
@ -24,7 +24,7 @@ Share::Share(AccountPtr account,
|
|||
const QString& path,
|
||||
const ShareType shareType,
|
||||
const Permissions permissions,
|
||||
const QString shareWith)
|
||||
const QSharedPointer<Sharee> shareWith)
|
||||
: _account(account),
|
||||
_id(id),
|
||||
_path(path),
|
||||
|
@ -45,6 +45,11 @@ Share::ShareType Share::getShareType() const
|
|||
return _shareType;
|
||||
}
|
||||
|
||||
QSharedPointer<Sharee> Share::getShareWith() const
|
||||
{
|
||||
return _shareWith;
|
||||
}
|
||||
|
||||
void Share::setPermissions(Permissions permissions)
|
||||
{
|
||||
OcsShareJob *job = new OcsShareJob(_account, this);
|
||||
|
@ -288,14 +293,18 @@ QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QVariantMap &data)
|
|||
expireDate));
|
||||
}
|
||||
|
||||
QSharedPointer<Share> ShareManager::parseShare(const QVariantMap &data) {
|
||||
|
||||
QSharedPointer<Share> ShareManager::parseShare(const QVariantMap &data)
|
||||
{
|
||||
QSharedPointer<Sharee> sharee(new Sharee(data.value("share_with").toString(),
|
||||
data.value("share_with_displayname").toString(),
|
||||
(Sharee::Type)data.value("share_type").toInt()));
|
||||
|
||||
return QSharedPointer<Share>(new Share(_account,
|
||||
data.value("id").toString(),
|
||||
data.value("path").toString(),
|
||||
(Share::ShareType)data.value("share_type").toInt(),
|
||||
(Share::Permissions)data.value("permissions").toInt(),
|
||||
data.value("share_with").toString()));
|
||||
sharee));
|
||||
}
|
||||
|
||||
void ShareManager::slotOcsError(int statusCode, const QString &message)
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#define SHARE_H
|
||||
|
||||
#include "accountfwd.h"
|
||||
#include "sharee.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QDate>
|
||||
|
@ -37,7 +38,7 @@ public:
|
|||
TypeUser = 0,
|
||||
TypeGroup = 1,
|
||||
TypeLink = 3,
|
||||
TypeRemote = 6,
|
||||
TypeRemote = 6
|
||||
};
|
||||
Q_DECLARE_FLAGS(ShareTypes, ShareType)
|
||||
|
||||
|
@ -61,7 +62,7 @@ public:
|
|||
const QString& path,
|
||||
const ShareType shareType,
|
||||
const Permissions permissions,
|
||||
const QString shareWith = "");
|
||||
const QSharedPointer<Sharee> shareWith = QSharedPointer<Sharee>(NULL));
|
||||
|
||||
/*
|
||||
* Get the id
|
||||
|
@ -76,7 +77,7 @@ public:
|
|||
/*
|
||||
* Get the shareWith
|
||||
*/
|
||||
QString getShareWith() const;
|
||||
QSharedPointer<Sharee> getShareWith() const;
|
||||
|
||||
/*
|
||||
* Get permissions
|
||||
|
@ -110,7 +111,7 @@ protected:
|
|||
QString _path;
|
||||
ShareType _shareType;
|
||||
Permissions _permissions;
|
||||
QString _shareWith;
|
||||
QSharedPointer<Sharee> _shareWith;
|
||||
|
||||
protected slots:
|
||||
void slotOcsError(int statusCode, const QString &message);
|
||||
|
|
|
@ -24,7 +24,20 @@ Sharee::Sharee(const QString shareWith,
|
|||
_type(type)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
QString Sharee::format() const
|
||||
{
|
||||
QString formatted = _displayName;
|
||||
|
||||
if (_type == Type::Group) {
|
||||
formatted += QLatin1String(" (group)");
|
||||
} else if (_type == Type::Federated) {
|
||||
formatted += QLatin1String(" (remote)");
|
||||
}
|
||||
|
||||
return formatted;
|
||||
}
|
||||
|
||||
QString Sharee::shareWith() const
|
||||
{
|
||||
return _shareWith;
|
||||
|
@ -40,15 +53,19 @@ Sharee::Type Sharee::type() const
|
|||
return _type;
|
||||
}
|
||||
|
||||
|
||||
ShareeModel::ShareeModel(AccountPtr account,
|
||||
const QString search,
|
||||
const QString type,
|
||||
QObject *parent)
|
||||
: QAbstractTableModel(parent),
|
||||
: QAbstractListModel(parent),
|
||||
_account(account),
|
||||
_search(search),
|
||||
_type(type)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ShareeModel::fetch()
|
||||
{
|
||||
OcsShareeJob *job = new OcsShareeJob(_account, this);
|
||||
connect(job, SIGNAL(shareeJobFinished(QVariantMap)), SLOT(shareesFetched(QVariantMap)));
|
||||
|
@ -66,17 +83,17 @@ void ShareeModel::shareesFetched(const QVariantMap &reply)
|
|||
*/
|
||||
auto exact = data.value("exact").toMap();
|
||||
{
|
||||
auto user = exact.value("user").toMap();
|
||||
if (user.size() > 0) {
|
||||
newSharees.append(parseSharee(user));
|
||||
auto users = exact.value("users").toList();
|
||||
foreach(auto user, users) {
|
||||
newSharees.append(parseSharee(user.toMap()));
|
||||
}
|
||||
auto group = exact.value("group").toMap();
|
||||
if (group.size() > 0) {
|
||||
newSharees.append(parseSharee(group));
|
||||
auto groups = exact.value("groups").toList();
|
||||
foreach(auto group, groups) {
|
||||
newSharees.append(parseSharee(group.toMap()));
|
||||
}
|
||||
auto remote = exact.value("remote").toMap();
|
||||
if (remote.size() > 0) {
|
||||
newSharees.append(parseSharee(remote));
|
||||
auto remotes = exact.value("remotes").toList();
|
||||
foreach(auto remote, remotes) {
|
||||
newSharees.append(parseSharee(remote.toMap()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -102,6 +119,8 @@ void ShareeModel::shareesFetched(const QVariantMap &reply)
|
|||
beginInsertRows(QModelIndex(), _sharees.size(), newSharees.size());
|
||||
_sharees += newSharees;
|
||||
endInsertRows();
|
||||
|
||||
shareesReady();
|
||||
}
|
||||
|
||||
QSharedPointer<Sharee> ShareeModel::parseSharee(const QVariantMap &data)
|
||||
|
@ -118,42 +137,25 @@ int ShareeModel::rowCount(const QModelIndex &) const
|
|||
return _sharees.size();
|
||||
}
|
||||
|
||||
int ShareeModel::columnCount(const QModelIndex &) const
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
QVariant ShareeModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (role == Qt::DisplayRole) {
|
||||
auto sharee = _sharees.at(index.row());
|
||||
if (index.row() < 0 || index.row() > _sharees.size()) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
switch(index.column()) {
|
||||
case 0:
|
||||
return sharee->displayName();
|
||||
case 1:
|
||||
return sharee->type();
|
||||
case 2:
|
||||
return sharee->shareWith();
|
||||
}
|
||||
if (role == Qt::DisplayRole || role == Qt::EditRole) {
|
||||
return _sharees.at(index.row())->format();
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant ShareeModel::headerData(int section, Qt::Orientation orientation, int role)
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << section << orientation << role;
|
||||
if (orientation == Qt::Horizontal) {
|
||||
switch(section) {
|
||||
case 0:
|
||||
return "Name";
|
||||
case 1:
|
||||
return "Type";
|
||||
case 2:
|
||||
return "Id";
|
||||
}
|
||||
QSharedPointer<Sharee> ShareeModel::getSharee(int at) {
|
||||
if (at < 0 || at > _sharees.size()) {
|
||||
return QSharedPointer<Sharee>(NULL);
|
||||
}
|
||||
|
||||
return _sharees.at(at);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,9 +11,12 @@
|
|||
* for more details.
|
||||
*/
|
||||
|
||||
#ifndef SHAREE_H
|
||||
#define SHAREE_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QFlags>
|
||||
#include <QAbstractTableModel>
|
||||
#include <QAbstractListModel>
|
||||
#include <QModelIndex>
|
||||
#include <QVariant>
|
||||
#include <QSharedPointer>
|
||||
|
@ -23,7 +26,7 @@
|
|||
|
||||
namespace OCC {
|
||||
|
||||
class Sharee : public QObject {
|
||||
class Sharee {
|
||||
public:
|
||||
|
||||
enum Type {
|
||||
|
@ -37,10 +40,10 @@ public:
|
|||
const QString displayName,
|
||||
const Type type);
|
||||
|
||||
QString format() const;
|
||||
QString shareWith() const;
|
||||
QString displayName() const;
|
||||
Type type() const;
|
||||
|
||||
|
||||
private:
|
||||
QString _shareWith;
|
||||
|
@ -48,7 +51,7 @@ private:
|
|||
Type _type;
|
||||
};
|
||||
|
||||
class ShareeModel : public QAbstractTableModel {
|
||||
class ShareeModel : public QAbstractListModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ShareeModel(AccountPtr account,
|
||||
|
@ -56,17 +59,21 @@ public:
|
|||
const QString type,
|
||||
QObject *parent = 0);
|
||||
|
||||
void fetch();
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
QVariant data(const QModelIndex &index, int role) const;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole);
|
||||
|
||||
QSharedPointer<Sharee> parseSharee(const QVariantMap &data);
|
||||
QSharedPointer<Sharee> getSharee(int at);
|
||||
|
||||
signals:
|
||||
void shareesReady();
|
||||
|
||||
private slots:
|
||||
void shareesFetched(const QVariantMap &reply);
|
||||
|
||||
private:
|
||||
QSharedPointer<Sharee> parseSharee(const QVariantMap &data);
|
||||
|
||||
AccountPtr _account;
|
||||
QString _search;
|
||||
QString _type;
|
||||
|
@ -75,3 +82,5 @@ private:
|
|||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //SHAREE_H
|
||||
|
|
|
@ -52,14 +52,16 @@ ShareUserGroupDialog::ShareUserGroupDialog(AccountPtr account, const QString &sh
|
|||
//Is this a file or folder?
|
||||
_isFile = QFileInfo(localPath).isFile();
|
||||
|
||||
_completer = new QCompleter(this);
|
||||
_ui->shareeLineEdit->setCompleter(_completer);
|
||||
|
||||
_ui->searchPushButton->setEnabled(false);
|
||||
_ui->shareeView->hide();
|
||||
_ui->searchMorePushButton->hide();
|
||||
_ui->sharePushButton->hide();
|
||||
|
||||
_manager = new ShareManager(_account, this);
|
||||
connect(_manager, SIGNAL(sharesFetched(QList<QSharedPointer<Share>>)), SLOT(slotSharesFetched(QList<QSharedPointer<Share>>)));
|
||||
connect(_manager, SIGNAL(shareCreated(QSharedPointer<Share>)), SLOT(getShares()));
|
||||
connect(_ui->shareeLineEdit, SIGNAL(returnPressed()), SLOT(on_searchPushButton_clicked()));
|
||||
connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)));
|
||||
}
|
||||
|
||||
void ShareUserGroupDialog::done( int r ) {
|
||||
|
@ -73,7 +75,7 @@ ShareUserGroupDialog::~ShareUserGroupDialog()
|
|||
delete _ui;
|
||||
}
|
||||
|
||||
void ShareUserGroupDialog::on_shareeLineEdit_textEdited(const QString &text)
|
||||
void ShareUserGroupDialog::on_shareeLineEdit_textChanged(const QString &text)
|
||||
{
|
||||
if (text == "") {
|
||||
_ui->searchPushButton->setEnabled(false);
|
||||
|
@ -84,41 +86,18 @@ void ShareUserGroupDialog::on_shareeLineEdit_textEdited(const QString &text)
|
|||
|
||||
void ShareUserGroupDialog::on_searchPushButton_clicked()
|
||||
{
|
||||
ShareeModel *model = new ShareeModel(_account,
|
||||
_ui->shareeLineEdit->text(),
|
||||
_isFile ? QLatin1String("file") : QLatin1String("folder"),
|
||||
_ui->shareeView);
|
||||
_ui->shareeView->setModel(model);
|
||||
|
||||
_ui->shareeView->show();
|
||||
_ui->searchMorePushButton->show();
|
||||
_ui->sharePushButton->show();
|
||||
_ui->sharePushButton->setEnabled(false);
|
||||
_completerModel = new ShareeModel(_account,
|
||||
_ui->shareeLineEdit->text(),
|
||||
_isFile ? QLatin1String("file") : QLatin1String("folder"),
|
||||
_completer);
|
||||
connect(_completerModel, SIGNAL(shareesReady()), SLOT(slotUpdateCompletion()));
|
||||
_completerModel->fetch();
|
||||
}
|
||||
|
||||
void ShareUserGroupDialog::on_searchMorePushButton_clicked()
|
||||
{
|
||||
//TODO IMPLEMENT
|
||||
}
|
||||
|
||||
void ShareUserGroupDialog::on_shareeView_activated()
|
||||
{
|
||||
_ui->sharePushButton->setEnabled(true);
|
||||
}
|
||||
|
||||
void ShareUserGroupDialog::on_sharePushButton_clicked()
|
||||
{
|
||||
const QModelIndex index = _ui->shareeView->currentIndex();
|
||||
|
||||
auto model = _ui->shareeView->model();
|
||||
|
||||
const QModelIndex shareWithIndex = model->index(index.row(), 2);
|
||||
const QModelIndex typeIndex = model->index(index.row(), 1);
|
||||
|
||||
QString shareWith = model->data(shareWithIndex, Qt::DisplayRole).toString();
|
||||
int type = model->data(typeIndex, Qt::DisplayRole).toInt();
|
||||
|
||||
_manager->createShare(_sharePath, (Share::ShareType)type, shareWith, Share::PermissionRead);
|
||||
void ShareUserGroupDialog::slotUpdateCompletion() {
|
||||
_completer->setModel(_completerModel);
|
||||
_ui->shareeLineEdit->setCompleter(_completer);
|
||||
_completer->complete();
|
||||
}
|
||||
|
||||
void ShareUserGroupDialog::getShares()
|
||||
|
@ -131,7 +110,10 @@ void ShareUserGroupDialog::slotSharesFetched(const QList<QSharedPointer<Share>>
|
|||
const QString versionString = _account->serverVersion();
|
||||
qDebug() << Q_FUNC_INFO << versionString << "Fetched" << shares.count() << "shares";
|
||||
|
||||
// TODO clear old shares
|
||||
QLayoutItem *child;
|
||||
while ((child = _ui->sharesLayout->takeAt(0)) != 0) {
|
||||
delete child;
|
||||
}
|
||||
|
||||
foreach(const auto &share, shares) {
|
||||
|
||||
|
@ -142,9 +124,20 @@ void ShareUserGroupDialog::slotSharesFetched(const QList<QSharedPointer<Share>>
|
|||
ShareDialogShare *s = new ShareDialogShare(share, this);
|
||||
_ui->sharesLayout->addWidget(s);
|
||||
}
|
||||
_ui->sharesLayout->invalidate();
|
||||
}
|
||||
|
||||
// Add all new shares to share list
|
||||
void ShareUserGroupDialog::slotCompleterActivated(const QModelIndex & index) {
|
||||
auto sharee = _completerModel->getSharee(index.row());
|
||||
|
||||
if (sharee.isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
_manager->createShare(_sharePath,
|
||||
(Share::ShareType)sharee->type(),
|
||||
sharee->shareWith(),
|
||||
Share::PermissionRead);
|
||||
}
|
||||
|
||||
ShareDialogShare::ShareDialogShare(QSharedPointer<Share> share,
|
||||
|
@ -155,6 +148,8 @@ ShareDialogShare::ShareDialogShare(QSharedPointer<Share> share,
|
|||
{
|
||||
_ui->setupUi(this);
|
||||
|
||||
_ui->sharedWith->setText(share->getShareWith()->format());
|
||||
|
||||
if (share->getPermissions() & Share::PermissionUpdate) {
|
||||
_ui->permissionUpdate->setCheckState(Qt::Checked);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
#include <QSharedPointer>
|
||||
#include <QList>
|
||||
|
||||
|
||||
class QCompleter;
|
||||
|
||||
namespace OCC {
|
||||
|
||||
namespace Ui {
|
||||
|
@ -34,6 +37,7 @@ class QuotaInfo;
|
|||
class SyncResult;
|
||||
class Share;
|
||||
class ShareManager;
|
||||
class ShareeModel;
|
||||
|
||||
class ShareDialogShare : public QWidget
|
||||
{
|
||||
|
@ -83,11 +87,11 @@ private slots:
|
|||
void done( int r );
|
||||
|
||||
|
||||
void on_shareeLineEdit_textEdited(const QString &text);
|
||||
void on_shareeLineEdit_textChanged(const QString &text);
|
||||
void on_searchPushButton_clicked();
|
||||
void on_searchMorePushButton_clicked();
|
||||
void on_sharePushButton_clicked();
|
||||
void on_shareeView_activated();
|
||||
|
||||
void slotUpdateCompletion();
|
||||
void slotCompleterActivated(const QModelIndex & index);
|
||||
|
||||
private:
|
||||
Ui::ShareUserGroupDialog *_ui;
|
||||
|
@ -95,11 +99,13 @@ private:
|
|||
QString _sharePath;
|
||||
QString _localPath;
|
||||
|
||||
QCompleter *_completer;
|
||||
ShareeModel *_completerModel;
|
||||
|
||||
bool _resharingAllowed;
|
||||
bool _isFile;
|
||||
|
||||
ShareManager *_manager;
|
||||
QList<ShareDialogShare*> _shares;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -103,59 +103,18 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item row="1" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="shareeLineEdit"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="searchPushButton">
|
||||
<property name="text">
|
||||
<string>Search</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLineEdit" name="shareeLineEdit"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTableView" name="shareeView">
|
||||
<property name="showDropIndicator" stdset="0">
|
||||
<bool>false</bool>
|
||||
<widget class="QPushButton" name="searchPushButton">
|
||||
<property name="text">
|
||||
<string>Search</string>
|
||||
</property>
|
||||
<property name="dragDropOverwriteMode">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QPushButton" name="searchMorePushButton">
|
||||
<property name="text">
|
||||
<string>Search more</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="sharePushButton">
|
||||
<property name="text">
|
||||
<string>Share</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
|
Loading…
Reference in a new issue