ShareDialog: Review fixes
authorChristian Kamm <mail@ckamm.de>
Wed, 12 Apr 2017 09:09:20 +0000 (11:09 +0200)
committerChristian Kamm <mail@ckamm.de>
Fri, 21 Apr 2017 08:16:08 +0000 (10:16 +0200)
* Allow creating nameless shares
* Display token as name for nameless shares
  (both to be consistent with server)
* Allow changing a share's name by editing it in the table
* Minor adjustments

src/gui/ocssharejob.cpp
src/gui/ocssharejob.h
src/gui/sharelinkwidget.cpp
src/gui/sharelinkwidget.h
src/gui/sharelinkwidget.ui
src/gui/sharemanager.cpp
src/gui/sharemanager.h
src/gui/shareusergroupwidget.ui

index 7c13df43e6de88e812ac02cca5c7eadfc7456053..5fcba7d8ca37c5b611226d04923fa62dbfd7b726 100644 (file)
@@ -84,6 +84,16 @@ void OcsShareJob::setPublicUpload(const QString &shareId, bool publicUpload)
     start();
 }
 
+void OcsShareJob::setName(const QString &shareId, const QString &name)
+{
+    appendPath(shareId);
+    setVerb("PUT");
+    addParam(QString::fromLatin1("name"), name);
+    _value = name;
+
+    start();
+}
+
 void OcsShareJob::setPermissions(const QString &shareId, 
                                  const Share::Permissions permissions)
 {
index 675c645923cb0b7eea7355734f0f02d233c21e1a..1066becc72e4b0cb2e0be9538faf0c41690ef8ce 100644 (file)
@@ -68,12 +68,17 @@ public:
     void setPassword(const QString &shareId, const QString& password);
 
     /**
-     * Void set the share to be public upload
+     * Set the share to be public upload
      * 
      * @param publicUpload Set or remove public upload
      */
     void setPublicUpload(const QString &shareId, bool publicUpload);
 
+    /**
+     * Change the name of a share
+     */
+    void setName(const QString &shareId, const QString &name);
+
     /**
      * Set the permissions
      *
index 63fd0b576318cab7c0cf9d8beacd09dd57bec80e..ddd3e3fe1bc9dee18f2bd26c0d92d18d7fc87c5e 100644 (file)
@@ -55,7 +55,9 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account,
     _ui->linkShares->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
 
     //Is this a file or folder?
-    _isFile = QFileInfo(localPath).isFile();
+    QFileInfo fi(localPath);
+    _isFile = fi.isFile();
+    _ui->nameLineEdit->setText(tr("%1 link").arg(fi.fileName()));
 
     // the following progress indicator widgets are added to layouts which makes them
     // automatically deleted once the dialog dies.
@@ -71,6 +73,7 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account,
     connect(_ui->nameLineEdit, SIGNAL(returnPressed()), SLOT(slotShareNameEntered()));
     connect(_ui->createShareButton, SIGNAL(clicked(bool)), SLOT(slotShareNameEntered()));
     connect(_ui->linkShares, SIGNAL(itemSelectionChanged()), SLOT(slotShareSelectionChanged()));
+    connect(_ui->linkShares, SIGNAL(itemChanged(QTableWidgetItem*)), SLOT(slotNameEdited(QTableWidgetItem*)));
     connect(_ui->checkBox_password, SIGNAL(clicked()), this, SLOT(slotCheckBoxPasswordClicked()));
     connect(_ui->lineEdit_password, SIGNAL(returnPressed()), this, SLOT(slotPasswordReturnPressed()));
     connect(_ui->lineEdit_password, SIGNAL(textChanged(QString)), this, SLOT(slotPasswordChanged(QString)));
@@ -193,7 +196,6 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
     table->clearContents();
     table->setRowCount(0);
 
-    auto shareIcon = QIcon::fromTheme(QLatin1String("mail-send"));
     auto deleteIcon = QIcon::fromTheme(QLatin1String("user-trash"),
                                        QIcon(QLatin1String(":/client/resources/delete.png")));
 
@@ -215,16 +217,22 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
         auto row = table->rowCount();
         table->insertRow(row);
 
+        auto nameItem = new QTableWidgetItem;
         QString name = linkShare->getName();
         if (name.isEmpty()) {
-            name = tr("Public link");
+            if (!_namesSupported) {
+                name = tr("Public link");
+                nameItem->setFlags(nameItem->flags() & ~Qt::ItemIsEditable);
+            } else {
+                name = linkShare->getToken();
+            }
         }
-        auto nameItem = new QTableWidgetItem(name);
+        nameItem->setText(name);
         nameItem->setData(Qt::UserRole, QVariant::fromValue(linkShare));
         table->setItem(row, 0, nameItem);
 
         auto shareButton = new QToolButton;
-        shareButton->setIcon(shareIcon);
+        shareButton->setText("...");
         shareButton->setProperty(propertyShareC, QVariant::fromValue(linkShare));
         shareButton->setMenu(_shareLinkMenu);
         shareButton->setPopupMode(QToolButton::InstantPopup);
@@ -339,10 +347,6 @@ void ShareLinkWidget::slotPasswordReturnPressed()
 {
     if (!selectedShare()) {
         // If share creation requires a password, we'll be in this case
-        if (_namesSupported && _ui->nameLineEdit->text().isEmpty()) {
-            _ui->nameLineEdit->setFocus();
-            return;
-        }
         if (_ui->lineEdit_password->text().isEmpty()) {
             _ui->lineEdit_password->setFocus();
             return;
@@ -362,6 +366,19 @@ void ShareLinkWidget::slotPasswordChanged(const QString& newText)
     _ui->pushButton_setPassword->setEnabled( newText.length() > 0 );
 }
 
+void ShareLinkWidget::slotNameEdited(QTableWidgetItem* item)
+{
+    if (!_namesSupported) {
+        return;
+    }
+
+    QString newName = item->text();
+    auto share = item->data(Qt::UserRole).value<QSharedPointer<LinkShare>>();
+    if (share && newName != share->getName() && newName != share->getToken()) {
+        share->setName(newName);
+    }
+}
+
 void ShareLinkWidget::setPassword(const QString &password)
 {
     if (auto current = selectedShare()) {
@@ -391,10 +408,8 @@ void ShareLinkWidget::slotPasswordSet()
 
 void ShareLinkWidget::slotShareNameEntered()
 {
-    if (!_ui->nameLineEdit->text().isEmpty() || !_namesSupported) {
-        _pi_create->startAnimation();
-        _manager->createLinkShare(_sharePath, _ui->nameLineEdit->text(), QString());
-    }
+    _pi_create->startAnimation();
+    _manager->createLinkShare(_sharePath, _ui->nameLineEdit->text(), QString());
 }
 
 void ShareLinkWidget::slotDeleteShareFetched()
index c12e121c1cdec33175a44b0188cb4cd642f66fd0..898b79a49dc0ccbb5af20f503e08ada3d8dab164 100644 (file)
@@ -25,6 +25,7 @@
 #include <QList>
 
 class QMenu;
+class QTableWidgetItem;
 
 namespace OCC {
 
@@ -68,6 +69,7 @@ private slots:
     void slotCheckBoxEditingClicked();
     void slotExpireDateChanged(const QDate &date);
     void slotPasswordChanged(const QString& newText);
+    void slotNameEdited(QTableWidgetItem* item);
 
     void slotShareLinkButtonTriggered(QAction* action);
 
index 25d8ba417b5c152aee086bbd1483b9490838c73e..9749a6990ece83eccc4273f97b564faece6009c0 100644 (file)
@@ -26,7 +26,7 @@
      <item>
       <widget class="QPushButton" name="createShareButton">
        <property name="text">
-        <string>&amp;Create</string>
+        <string>&amp;Create new</string>
        </property>
       </widget>
      </item>
@@ -81,7 +81,7 @@
       <property name="bottomMargin">
        <number>0</number>
       </property>
-      <item row="4" column="0">
+      <item row="7" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout_expire">
         <property name="leftMargin">
          <number>0</number>
         </item>
        </layout>
       </item>
-      <item row="0" column="0">
-       <widget class="QWidget" name="widget_editing" native="true">
-        <layout class="QHBoxLayout" name="horizontalLayout_editing">
-         <property name="leftMargin">
-          <number>0</number>
-         </property>
-         <property name="topMargin">
-          <number>0</number>
-         </property>
-         <property name="rightMargin">
-          <number>0</number>
-         </property>
-         <property name="bottomMargin">
-          <number>0</number>
-         </property>
-         <item>
-          <widget class="QCheckBox" name="checkBox_editing">
-           <property name="text">
-            <string>Allow editing</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item row="2" column="0">
+      <item row="5" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <property name="leftMargin">
          <number>20</number>
         </item>
        </layout>
       </item>
-      <item row="1" column="0">
+      <item row="4" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout_password">
         <item>
          <widget class="QCheckBox" name="checkBox_password">
         </item>
        </layout>
       </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Link properties:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QWidget" name="widget_editing" native="true">
+        <layout class="QHBoxLayout" name="horizontalLayout_editing">
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QCheckBox" name="checkBox_editing">
+           <property name="text">
+            <string>Allow editing</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
index 4f25fa477ab877806c5894b0d6206ba0a03cbb66..5d50fcea58b92ac168991baf0f834a35fb9cfca9 100644 (file)
@@ -122,13 +122,15 @@ bool LinkShare::isPasswordSet() const
 LinkShare::LinkShare(AccountPtr account,
                      const QString& id,
                      const QString& path,
-                     const QString &name,
+                     const QString& name,
+                     const QString& token,
                      Permissions permissions,
                      bool passwordSet,
                      const QUrl& url,
                      const QDate& expireDate)
 : Share(account, id, path, Share::TypeLink, permissions),
   _name(name),
+  _token(token),
   _passwordSet(passwordSet),
   _expireDate(expireDate),
   _url(url)
@@ -155,6 +157,19 @@ QString LinkShare::getName() const
     return _name;
 }
 
+void LinkShare::setName(const QString& name)
+{
+    OcsShareJob *job = new OcsShareJob(_account);
+    connect(job, SIGNAL(shareJobFinished(QVariantMap,QVariant)), SLOT(slotNameSet(QVariantMap,QVariant)));
+    connect(job, SIGNAL(ocsError(int,QString)), SLOT(slotOcsError(int,QString)));
+    job->setName(getId(), name);
+}
+
+QString LinkShare::getToken() const
+{
+    return _token;
+}
+
 void LinkShare::slotPublicUploadSet(const QVariantMap&, const QVariant &value)
 {
     if (value.toBool()) {
@@ -209,6 +224,12 @@ void LinkShare::slotSetPasswordError(int statusCode, const QString &message)
     emit passwordSetError(statusCode, message);
 }
 
+void LinkShare::slotNameSet(const QVariantMap &, const QVariant &value)
+{
+    _name = value.toString();
+    emit nameSet();
+}
+
 ShareManager::ShareManager(AccountPtr account, QObject *parent)
 : QObject(parent),
   _account(account)
@@ -345,7 +366,8 @@ void ShareManager::slotSharesFetched(const QVariantMap &reply)
     emit sharesFetched(shares);
 }
 
-QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QVariantMap &data) {
+QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QVariantMap &data)
+{
     QUrl url;
 
     // From ownCloud server 8.2 the url field is always set for public shares
@@ -366,12 +388,11 @@ QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QVariantMap &data)
        expireDate = QDate::fromString(data.value("expiration").toString(), "yyyy-MM-dd 00:00:00");
     }
 
-    QString name = data.value("name").toString();
-
     return QSharedPointer<LinkShare>(new LinkShare(_account,
                                                    data.value("id").toString(),
                                                    data.value("path").toString(),
-                                                   name,
+                                                   data.value("name").toString(),
+                                                   data.value("token").toString(),
                                                    (Share::Permissions)data.value("permissions").toInt(),
                                                    data.value("share_with").isValid(),
                                                    url,
index 742170dffc6295012d1e6ff3be69b8fd2c8c5722..da97b4f371c60488b8badd0ebcdb80a0ca67965d 100644 (file)
@@ -133,6 +133,7 @@ public:
                        const QString& id,
                        const QString& path,
                        const QString& name,
+                       const QString& token,
                        const Permissions permissions,
                        bool passwordSet,
                        const QUrl& url,
@@ -158,10 +159,22 @@ public:
     void setPublicUpload(bool publicUpload);
 
     /*
-     * Returns the name of the link share.
+     * Returns the name of the link share. Can be empty.
      */
     QString getName() const;
 
+    /*
+     * Set the name of the link share.
+     *
+     * Emits either nameSet() or serverError().
+     */
+    void setName(const QString& name);
+
+    /*
+     * Returns the token of the link share.
+     */
+    QString getToken() const;
+
     /*
      * Set the password
      *
@@ -193,15 +206,18 @@ signals:
     void publicUploadSet();
     void passwordSet();
     void passwordSetError(int statusCode, const QString &message);
+    void nameSet();
 
 private slots:
     void slotPasswordSet(const QVariantMap&, const QVariant &value);
     void slotPublicUploadSet(const QVariantMap&, const QVariant &value);
     void slotExpireDateSet(const QVariantMap& reply, const QVariant &value);
     void slotSetPasswordError(int statusCode, const QString &message);
+    void slotNameSet(const QVariantMap&, const QVariant &value);
 
 private:
     QString _name;
+    QString _token;
     bool _passwordSet;
     QDate _expireDate;
     QUrl _url;
index 90572bd9a5296fcf074c133e2f1fca114ad74aef..615c5b2f199ea3d271da4e87f824d05f3c3f431a 100644 (file)
    <string>Share NewDocument.odt</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
    <item>
     <layout class="QHBoxLayout" name="shareeHorizontalLayout">
      <item>