show conflicts / conflict-count in table-view

display a small indicator in table view, given a doc has conflicts

PR: #670
PR-URL: https://github.com/apache/couchdb-fauxton/pull/670
Reviewed-By: Benjamin Keen <ben.k...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/319ce992
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/319ce992
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/319ce992

Branch: refs/heads/master
Commit: 319ce9924f60adad6f9e61af363a43f51ad70171
Parents: 978ae69
Author: Robert Kowalski <robertkowal...@apache.org>
Authored: Tue Mar 15 14:37:37 2016 +0000
Committer: Robert Kowalski <robertkowal...@apache.org>
Committed: Thu Apr 21 19:38:38 2016 +0200

----------------------------------------------------------------------
 .../documents/assets/less/index-results.less    |  5 +-
 app/addons/documents/header/header.actions.js   |  2 +
 .../index-results.components.react.jsx          | 37 +++++++---
 .../tests/nightwatch/tableViewConflicts.js      | 37 ++++++++++
 .../populateDatabaseWithConflicts.js            | 73 ++++++++++++++++++++
 5 files changed, 144 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/319ce992/app/addons/documents/assets/less/index-results.less
----------------------------------------------------------------------
diff --git a/app/addons/documents/assets/less/index-results.less 
b/app/addons/documents/assets/less/index-results.less
index dc46c6d..df11f72 100644
--- a/app/addons/documents/assets/less/index-results.less
+++ b/app/addons/documents/assets/less/index-results.less
@@ -102,8 +102,11 @@
   .tableview-checkbox-cell input {
     margin: 0 0 0 8px;
   }
+  .tableview-conflict {
+    color: #FF0000;
+  }
   .tableview-el-last {
-    width: 50px;
+    width: 75px;
   }
   .tableview-el-copy {
     width: 35px;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/319ce992/app/addons/documents/header/header.actions.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/header/header.actions.js 
b/app/addons/documents/header/header.actions.js
index fcc7e7f..282d20b 100644
--- a/app/addons/documents/header/header.actions.js
+++ b/app/addons/documents/header/header.actions.js
@@ -26,8 +26,10 @@ function (app, FauxtonAPI, ActionTypes, ActionsQueryOptions) 
{
 
       if (state) {
         delete params.include_docs;
+        delete params.conflicts;
       } else {
         params.include_docs = true;
+        params.conflicts = true;
       }
 
       app.utils.localStorageSet('include_docs_bulkdocs', 
bulkDocsCollection.toJSON());

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/319ce992/app/addons/documents/index-results/index-results.components.react.jsx
----------------------------------------------------------------------
diff --git 
a/app/addons/documents/index-results/index-results.components.react.jsx 
b/app/addons/documents/index-results/index-results.components.react.jsx
index 612eeb4..6a88da3 100644
--- a/app/addons/documents/index-results/index-results.components.react.jsx
+++ b/app/addons/documents/index-results/index-results.components.react.jsx
@@ -132,21 +132,40 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components, Documents, Fauxto
       );
     },
 
-    getAttachmentRow: function (el) {
+    getAdditionalInfoRow: function (el) {
       var attachmentCount = Object.keys(el._attachments || {}).length;
-      var paperClip = null;
-      var text = null;
+      var attachmentIndicator = null;
+      var textAttachments = null;
+
+      var conflictCount = Object.keys(el._conflicts || {}).length;
+      var conflictIndicator = null;
+      var textConflicts = null;
+
 
       if (attachmentCount) {
-        text = attachmentCount === 1 ? attachmentCount + ' Attachment' : 
attachmentCount + ' Attachments';
-        paperClip = (
-          <div><i className="icon fonticon-paperclip"></i> 
{attachmentCount}</div>
+        textAttachments = attachmentCount === 1 ? attachmentCount + ' 
Attachment' : attachmentCount + ' Attachments';
+        attachmentIndicator = (
+          <div style={{display: 'inline', marginLeft: '5px'}} 
title={textAttachments}>
+            <i className="icon fonticon-paperclip"></i>{attachmentCount}
+          </div>
+        );
+      }
+
+      if (conflictCount) {
+        textConflicts = conflictCount === 1 ? conflictCount + ' Conflict' : 
conflictCount + ' Conflicts';
+        conflictIndicator = (
+          <div className="tableview-conflict" data-conflicts-indicator 
style={{display: 'inline'}} title={textConflicts}>
+            <i
+              style={{fontSize: '17px'}}
+              className="icon icon-code-fork"></i>{conflictCount}
+          </div>
         );
       }
 
       return (
-        <td title={text} className="tableview-el-last">
-          {paperClip}
+        <td className="tableview-el-last">
+          {conflictIndicator}
+          {attachmentIndicator}
         </td>
       );
     },
@@ -182,7 +201,7 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components, Documents, Fauxto
           {this.getCopyButton(docContent)}
           {this.maybeGetSpecialField(el, i)}
           {this.getRowContents(el, i)}
-          {this.getAttachmentRow(docContent)}
+          {this.getAdditionalInfoRow(docContent)}
         </tr>
       );
     }

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/319ce992/app/addons/documents/tests/nightwatch/tableViewConflicts.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/tableViewConflicts.js 
b/app/addons/documents/tests/nightwatch/tableViewConflicts.js
new file mode 100644
index 0000000..c0be7c3
--- /dev/null
+++ b/app/addons/documents/tests/nightwatch/tableViewConflicts.js
@@ -0,0 +1,37 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy 
of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations 
under
+// the License.
+
+module.exports = {
+
+  'Shows how many conflicts have appeared': function (client) {
+    var waitTime = client.globals.maxWaitTime,
+        newDatabaseName = client.globals.testDatabaseName,
+        baseUrl = client.globals.test_settings.launch_url;
+
+    client
+      .populateDatabaseWithConflicts(newDatabaseName)
+      .checkForDocumentCreated('outfit1')
+      .loginToGUI()
+      .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
+
+      .clickWhenVisible('.alternative-header .two-sides-toggle-button 
button:last-child')
+      .waitForElementVisible('.table', client.globals.maxWaitTime, false)
+
+      .clickWhenVisible('.control-toggle-include-docs')
+
+      .waitForElementVisible('.table-container-autocomplete', 
client.globals.maxWaitTime, false)
+
+      .assert.visible('.table [data-conflicts-indicator="true"]')
+
+      .end();
+  }
+};

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/319ce992/test/nightwatch_tests/custom-commands/populateDatabaseWithConflicts.js
----------------------------------------------------------------------
diff --git 
a/test/nightwatch_tests/custom-commands/populateDatabaseWithConflicts.js 
b/test/nightwatch_tests/custom-commands/populateDatabaseWithConflicts.js
new file mode 100644
index 0000000..b252d14
--- /dev/null
+++ b/test/nightwatch_tests/custom-commands/populateDatabaseWithConflicts.js
@@ -0,0 +1,73 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy 
of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations 
under
+// the License.
+
+var util = require('util'),
+    events = require('events'),
+    helpers = require('../helpers/helpers.js'),
+    request = require('request');
+
+function PopulateDatabaseWithConflicts () {
+  events.EventEmitter.call(this);
+}
+
+util.inherits(PopulateDatabaseWithConflicts, events.EventEmitter);
+
+PopulateDatabaseWithConflicts.prototype.command = function (databaseName) {
+  var nano = helpers.getNanoInstance(),
+      database = nano.use(databaseName);
+
+  database.insert({
+    hat: 'flamingo'
+  }, 'outfit1', function () {
+    createConflictingDoc(null, function () {
+      this.emit('complete');
+    }.bind(this));
+  }.bind(this));
+
+  function createConflictingDoc (err, cb) {
+    request({
+      uri: helpers.test_settings.db_url + '/' + databaseName + 
'/conflictingdoc',
+      method: 'PUT',
+      json: true,
+      body: {
+        id: 'conflictingdoc',
+        rocko: 'dances'
+      }
+    }, function (err, res, body) {
+      if (err) {
+        console.log(
+          'Error in nano populateDatabase Function: ' + err.message
+        );
+      }
+      request({
+        uri: helpers.test_settings.db_url + '/' + databaseName + 
'/conflictingdoc?new_edits=false',
+        method: 'PUT',
+        json: true,
+        body: {
+          _rev: '4-afae890a0310210db079b0f49fb2569d',
+          rocko: 'jumps'
+        }
+      }, function (err, res, body) {
+        if (err) {
+          console.log('Error in nano populateDatabase Function: ' +
+            err.message);
+        }
+
+        cb && cb();
+      });
+    });
+  }
+
+  return this;
+};
+
+module.exports = PopulateDatabaseWithConflicts;

Reply via email to