Repository: couchdb-fauxton
Updated Branches:
  refs/heads/master 574af6a8b -> e6450a0d0


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git 
a/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx 
b/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
index 67df4e5..e217d3c 100644
--- a/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
+++ b/app/addons/documents/index-editor/tests/viewIndex.componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/documents/index-editor/actions',
   'addons/documents/resources',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React, 
ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -53,7 +54,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     describe('getReduceValue', function () {
@@ -169,12 +170,12 @@ define([
     afterEach(function () {
       restore(Actions.newDesignDoc);
       restore(Actions.designDocChange);
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls new design doc on new selected', function () {
       var spy = sinon.spy(Actions, 'newDesignDoc');
-      TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#ddoc')[0], {
+      
TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#ddoc')[0], 
{
         target: {
           value: 'new'
         }
@@ -185,7 +186,7 @@ define([
 
     it('calls design doc changed on a different design doc selected', function 
() {
       var spy = sinon.spy(Actions, 'designDocChange');
-      TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#ddoc')[0], {
+      
TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#ddoc')[0], 
{
         target: {
           value: 'another-doc'
         }
@@ -197,7 +198,7 @@ define([
     it('calls design doc changed on new design doc entered', function () {
       var spy = sinon.spy(Actions, 'designDocChange');
       Actions.newDesignDoc();
-      
TestUtils.Simulate.change($(selectorEl.getDOMNode()).find('#new-ddoc')[0], {
+      
TestUtils.Simulate.change($(ReactDOM.findDOMNode(selectorEl)).find('#new-ddoc')[0],
 {
         target: {
           value: 'new-doc-entered'
         }
@@ -207,12 +208,12 @@ define([
     });
 
     it('does not filter usual design docs', function () {
-      assert.ok(/_design\/test-doc/.test($(selectorEl.getDOMNode()).text()));
+      
assert.ok(/_design\/test-doc/.test($(ReactDOM.findDOMNode(selectorEl)).text()));
     });
 
     it('filters mango docs', function () {
       selectorEl = TestUtils.renderIntoDocument(<Views.DesignDocSelector/>, 
container);
-      
assert.notOk(/_design\/123mango/.test($(selectorEl.getDOMNode()).text()));
+      
assert.notOk(/_design\/123mango/.test($(ReactDOM.findDOMNode(selectorEl)).text()));
     });
   });
 
@@ -228,7 +229,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
       sandbox.restore();
     });
 
@@ -253,7 +254,7 @@ define([
     it('calls changeViewName on view name change', function () {
       var viewName = 'new-name';
       var spy = sandbox.spy(Actions, 'changeViewName');
-      var el = $(editorEl.getDOMNode()).find('#index-name')[0];
+      var el = $(ReactDOM.findDOMNode(editorEl)).find('#index-name')[0];
       TestUtils.Simulate.change(el, {
         target: {
           value: viewName

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/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 40af4e2..f809883 100644
--- a/app/addons/documents/index-results/index-results.components.react.jsx
+++ b/app/addons/documents/index-results/index-results.components.react.jsx
@@ -423,7 +423,7 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components, Documents, Fauxto
               disabled={this.props.isLoading}
               title="Select all docs that can be..." /> : null}
 
-            <ReactCSSTransitionGroup transitionName="slow-fade">
+            <ReactCSSTransitionGroup transitionName="slow-fade" 
transitionEnterTimeout={500} transitionLeaveTimeout={300}>
               {this.getDocumentList()}
             </ReactCSSTransitionGroup>
           </div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git 
a/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
 
b/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
index 7182cb6..7bde20b 100644
--- 
a/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
+++ 
b/app/addons/documents/index-results/tests/index-results.componentsSpec.react.jsx
@@ -16,11 +16,11 @@ define([
   'addons/documents/index-results/stores',
   'addons/documents/resources',
   'addons/databases/resources',
-
   'addons/documents/tests/document-test-helper',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, IndexResultsActions, Stores, Documents, 
Databases, documentTestHelper, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, IndexResultsActions, Stores, Documents, 
Databases, documentTestHelper, utils, React, ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -39,7 +39,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -51,7 +51,7 @@ define([
         IndexResultsActions.resultsListReset();
 
         instance = TestUtils.renderIntoDocument(<Views.List />, container);
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         assert.equal($el.text(), 'No Index Created Yet!');
       });
 
@@ -74,7 +74,7 @@ define([
 
 
         instance = TestUtils.renderIntoDocument(<Views.List />, container);
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         assert.equal($el.text(), 'I <3 Hamburg');
       });
     });
@@ -93,7 +93,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -112,7 +112,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length === 0);
       });
@@ -143,7 +143,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length > 0);
       });
@@ -168,7 +168,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length === 0);
       });
@@ -188,7 +188,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length === 0);
       });
@@ -208,7 +208,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.tableview-checkbox-cell input').length > 0);
       });
@@ -228,7 +228,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         assert.ok($el.find('.js-row-select').length > 0);
       });
 
@@ -247,7 +247,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.notOk($el.hasClass('show-select'));
       });
@@ -261,7 +261,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -282,7 +282,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
         var $targetNode = $el.find('td.tableview-el-last').prev();
 
         var formattedDoc = JSON.stringify(doc.object, null, '  ');
@@ -300,7 +300,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.equal($el.find('.icon-filter').length, 0);
 
@@ -318,7 +318,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(instance).parentNode);
+        
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(instance).parentNode);
         store.reset();
       });
 
@@ -329,7 +329,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.loading-lines').length === 1);
       });
@@ -341,7 +341,7 @@ define([
           container
         );
 
-        var $el = $(instance.getDOMNode());
+        var $el = $(ReactDOM.findDOMNode(instance));
 
         assert.ok($el.find('.loading-lines').length === 0);
       });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx 
b/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
index 2c126ad..5b276f9 100644
--- a/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
+++ b/app/addons/documents/mango/tests/mango.componentsSpec.react.jsx
@@ -16,13 +16,12 @@ define([
   'addons/documents/mango/mango.stores',
   'addons/documents/mango/mango.actions',
   'addons/documents/mango/mango.actiontypes',
-
   'addons/documents/resources',
   'addons/databases/resources',
-
   'testUtils',
-  'react'
-], function (FauxtonAPI, Views, Stores, MangoActions, ActionTypes, Resources, 
Databases, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, MangoActions, ActionTypes, Resources, 
Databases, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -40,7 +39,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('renders a default index definition', function () {
@@ -58,7 +57,7 @@ define([
         <Views.MangoIndexEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.db-title').text(), 'testdb');
     });
@@ -68,7 +67,7 @@ define([
         <Views.MangoIndexEditorController description="CouchDB Query is 
great!" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.editor-description').text(), 'CouchDB Query is 
great!');
     });
@@ -123,7 +122,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('lists our available indexes', function () {
@@ -131,7 +130,7 @@ define([
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
       assert.equal($el.find('.mango-available-indexes').length, 1);
 
       assert.include(
@@ -145,7 +144,7 @@ define([
     });
 
     it('has a default query', function () {
-      editor = React.render(
+      editor = ReactDOM.render(
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
@@ -183,7 +182,7 @@ define([
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
       assert.equal($el.find('.info-changed-query').length, 1);
     });
 
@@ -192,7 +191,7 @@ define([
         <Views.MangoQueryEditorController description="foo" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.db-title').text(), 'testdb');
     });
@@ -202,7 +201,7 @@ define([
         <Views.MangoQueryEditorController description="CouchDB Query is 
great!" />,
         container
       );
-      var $el = $(editor.getDOMNode());
+      var $el = $(ReactDOM.findDOMNode(editor));
 
       assert.equal($el.find('.editor-description').text(), 'CouchDB Query is 
great!');
     });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
----------------------------------------------------------------------
diff --git 
a/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx 
b/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
index 7c6c07e..afeaaac 100644
--- a/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
+++ b/app/addons/documents/pagination/tests/pagination.componentSpec.react.jsx
@@ -14,8 +14,8 @@ define([
   'addons/documents/pagination/pagination.react',
   'testUtils',
   'react',
-
-], function (FauxtonAPI, Views, utils, React) {
+  'react-dom'
+], function (FauxtonAPI, Views, utils, React, ReactDOM) {
 
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
@@ -39,11 +39,11 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(selectorEl).parentNode);
+        
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(selectorEl).parentNode);
       });
 
       it('on new select calls callback with new page size', function () {
-        var selectEl = $(selectorEl.getDOMNode()).find('#select-per-page')[0];
+        var selectEl = 
$(ReactDOM.findDOMNode(selectorEl)).find('#select-per-page')[0];
         var perPage = 5;
         TestUtils.Simulate.change(selectEl, {
           target: {
@@ -63,7 +63,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(React.findDOMNode(selectorEl).parentNode);
+        
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(selectorEl).parentNode);
       });
 
       it('shows the amount of fields, none hidden', function () {
@@ -73,7 +73,7 @@ define([
           container
         );
 
-        var text = $(selectorEl.getDOMNode()).find('.shown-fields').text();
+        var text = 
$(ReactDOM.findDOMNode(selectorEl)).find('.shown-fields').text();
 
         assert.equal('Showing 7 columns.', text);
       });
@@ -85,7 +85,7 @@ define([
           container
         );
 
-        var text = $(selectorEl.getDOMNode()).find('.shown-fields').text();
+        var text = 
$(ReactDOM.findDOMNode(selectorEl)).find('.shown-fields').text();
 
         assert.equal('Showing 5 of 7 columns.', text);
       });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/queryoptions/queryoptions.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/queryoptions/queryoptions.react.jsx 
b/app/addons/documents/queryoptions/queryoptions.react.jsx
index 977edba..ff8b76c 100644
--- a/app/addons/documents/queryoptions/queryoptions.react.jsx
+++ b/app/addons/documents/queryoptions/queryoptions.react.jsx
@@ -14,12 +14,13 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/queryoptions/stores',
   'addons/documents/queryoptions/actions',
-  'addons/components/react-components.react',
+  'addons/components/react-components.react'
 ],
 
-function (app, FauxtonAPI, React, Stores, Actions, Components) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, Actions, Components) {
   var store = Stores.queryOptionsStore;
   var Tray = Components.Tray;
   var TrayContents = Components.TrayContents;
@@ -127,8 +128,8 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components) {
 
     updateBetweenKeys: function () {
       this.props.updateBetweenKeys({
-        startkey: React.findDOMNode(this.refs.startkey).value,
-        endkey: React.findDOMNode(this.refs.endkey).value,
+        startkey: ReactDOM.findDOMNode(this.refs.startkey).value,
+        endkey: ReactDOM.findDOMNode(this.refs.endkey).value,
         include: this.props.betweenKeys.include
       });
     },
@@ -390,7 +391,7 @@ A key value is the first parameter emitted in a map 
function. For example emit("
     KeySearchFields: KeySearchFields,
     AdditionalParams: AdditionalParams,
     render: function (el) {
-      React.render(<QueryOptionsController />, $(el)[0]);
+      ReactDOM.render(<QueryOptionsController />, $(el)[0]);
     }
   };
 });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git 
a/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx 
b/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
index b782d48..47ed9c8 100644
--- 
a/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
+++ 
b/app/addons/documents/queryoptions/tests/queryoptions.componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/documents/queryoptions/actions',
   'addons/documents/resources',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, Actions, Documents, utils, React, 
ReactDOM) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = utils.assert;
@@ -32,7 +33,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     describe('MainFieldsView', function () {
@@ -52,7 +53,7 @@ define([
       it('updates group level', function () {
         var spy = sinon.spy();
         mainFieldsEl = TestUtils.renderIntoDocument(<Views.MainFieldsView 
updateGroupLevel={spy} reduce={true} includeDocs={false} showReduce={true}/>, 
container);
-        var el = $(mainFieldsEl.getDOMNode()).find('#qoGroupLevel')[0];
+        var el = 
$(ReactDOM.findDOMNode(mainFieldsEl)).find('#qoGroupLevel')[0];
         TestUtils.Simulate.change(el, {target: {value: 'exact'}});
 
         assert.ok(spy.calledOnce);
@@ -61,7 +62,7 @@ define([
       it('toggles include docs on change', function () {
         var spy = sinon.spy();
         mainFieldsEl = TestUtils.renderIntoDocument(<Views.MainFieldsView 
toggleIncludeDocs={spy} reduce={false} includeDocs={false} 
showReduce={false}/>, container);
-        var el = $(mainFieldsEl.getDOMNode()).find('#qoIncludeDocs')[0];
+        var el = 
$(ReactDOM.findDOMNode(mainFieldsEl)).find('#qoIncludeDocs')[0];
         TestUtils.Simulate.change(el);
 
         assert.ok(spy.calledOnce);
@@ -72,7 +73,7 @@ define([
         mainFieldsEl = TestUtils.renderIntoDocument(
           <Views.MainFieldsView reduce={false} includeDocs={false} 
showReduce={false} docURL={customDocURL} />,
           container);
-        
assert.equal($(React.findDOMNode(mainFieldsEl)).find('.help-link').attr('href'),
 customDocURL);
+        
assert.equal($(ReactDOM.findDOMNode(mainFieldsEl)).find('.help-link').attr('href'),
 customDocURL);
       });
 
     });
@@ -88,7 +89,7 @@ define([
           toggleByKeys={spy}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#byKeys')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#byKeys')[0];
         TestUtils.Simulate.click(el);
         assert.ok(spy.calledOnce);
       });
@@ -102,7 +103,7 @@ define([
           betweenKeys={{}}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#betweenKeys')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#betweenKeys')[0];
         TestUtils.Simulate.click(el);
         assert.ok(spy.calledOnce);
       });
@@ -116,7 +117,7 @@ define([
           betweenKeys={{}}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#keys-input')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#keys-input')[0];
         TestUtils.Simulate.change(el, {target: {value: 'boom'}});
         assert.ok(spy.calledWith('boom'));
       });
@@ -135,7 +136,7 @@ define([
           betweenKeys={betweenKeys}
           />, container);
 
-        var el = $(keysEl.getDOMNode()).find('#endkey')[0];
+        var el = $(ReactDOM.findDOMNode(keysEl)).find('#endkey')[0];
         TestUtils.Simulate.change(el, {target: {value: 'boom'}});
         assert.ok(spy.calledOnce);
       });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/sidebar/sidebar.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/sidebar/sidebar.react.jsx 
b/app/addons/documents/sidebar/sidebar.react.jsx
index 660fff5..dd5abc2 100644
--- a/app/addons/documents/sidebar/sidebar.react.jsx
+++ b/app/addons/documents/sidebar/sidebar.react.jsx
@@ -14,16 +14,16 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/documents/sidebar/stores',
   'addons/documents/sidebar/actions',
   'addons/components/react-components.react',
   'addons/documents/views',
   'addons/documents/helpers',
-
   'plugins/prettify'
 ],
 
-function (app, FauxtonAPI, React, Stores, Actions, Components, DocumentViews, 
DocumentHelper) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, Actions, Components, 
DocumentViews, DocumentHelper) {
   var DeleteDBModal = DocumentViews.Views.DeleteDBModal;
   var store = Stores.sidebarStore;
   var LoadLines = Components.LoadLines;
@@ -135,7 +135,7 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components, DocumentViews, Do
       e.preventDefault();
       var newToggleState = !this.props.contentVisible;
       var state = newToggleState ? 'show' : 'hide';
-      $(React.findDOMNode(this)).find('.accordion-body').collapse(state);
+      $(ReactDOM.findDOMNode(this)).find('.accordion-body').collapse(state);
       this.props.toggle(this.props.designDocName, this.props.title);
     },
 
@@ -221,7 +221,7 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components, DocumentViews, Do
       e.preventDefault();
       var newToggleState = !this.props.contentVisible;
       var state = newToggleState ? 'show' : 'hide';
-      $(React.findDOMNode(this)).find('#' + 
this.props.designDocName).collapse(state);
+      $(ReactDOM.findDOMNode(this)).find('#' + 
this.props.designDocName).collapse(state);
       this.props.toggle(this.props.designDocName);
     },
 
@@ -326,7 +326,7 @@ function (app, FauxtonAPI, React, Stores, Actions, 
Components, DocumentViews, Do
       this.dbModal = new DeleteDBModal({
         database: this.props.database,
         isSystemDatabase: (/^_/).test(this.props.database.id),
-        el: React.findDOMNode(this)
+        el: ReactDOM.findDOMNode(this)
       });
 
       this.dbModal.render();

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git 
a/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx 
b/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
index ec3a046..a57fc28 100644
--- a/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
+++ b/app/addons/documents/sidebar/tests/sidebar.componentsSpec.react.jsx
@@ -12,9 +12,10 @@
 define([
   'api',
   'react',
+  'react-dom',
   'testUtils',
   'addons/documents/sidebar/sidebar.react'
-], function (FauxtonAPI, React, utils, Components) {
+], function (FauxtonAPI, React, ReactDOM, utils, Components) {
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
   var DesignDoc = Components.DesignDoc;
@@ -28,7 +29,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('confirm only single sub-option is shown by default (metadata link)', 
function () {
@@ -41,7 +42,7 @@ define([
         designDoc={{}}
         designDocName="id"
         databaseName="db-name" />, container);
-      var subOptions = $(React.findDOMNode(el)).find('.accordion-body li');
+      var subOptions = $(ReactDOM.findDOMNode(el)).find('.accordion-body li');
       assert.equal(subOptions.length, 1);
    });
 
@@ -64,7 +65,7 @@ define([
         }}
         designDocName="id"
         databaseName="db-name" />, container);
-      var subOptions = $(React.findDOMNode(el)).find('.accordion-body li');
+      var subOptions = $(ReactDOM.findDOMNode(el)).find('.accordion-body li');
       assert.equal(subOptions.length, 3); // 1 for "Metadata" row, 1 for Type 
List row ("search indexes") and one for the index itself
     });
 
@@ -83,7 +84,7 @@ define([
         designDoc={{}} // note that this is empty
         designDocName="id"
         databaseName="db-name" />, container);
-      var subOptions = $(React.findDOMNode(el)).find('.accordion-body li');
+      var subOptions = $(ReactDOM.findDOMNode(el)).find('.accordion-body li');
       assert.equal(subOptions.length, 1);
     });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/documents/tests/helpersSpec.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/helpersSpec.js 
b/app/addons/documents/tests/helpersSpec.js
new file mode 100644
index 0000000..0f2ba29
--- /dev/null
+++ b/app/addons/documents/tests/helpersSpec.js
@@ -0,0 +1,31 @@
+// 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.
+define([
+  'api',
+  'addons/documents/helpers',
+  'testUtils'
+], function (FauxtonAPI, Helpers, testUtils) {
+  var assert = testUtils.assert;
+
+  describe('Helpers', function () {
+
+    describe('parseJSON', function () {
+      it('replaces "\\n" with actual newlines', function () {
+        var string = 'I am a string\\nwith\\nfour\\nlinebreaks\\nin';
+        var result = Helpers.parseJSON(string);
+        assert.equal(result.match(/\n/g).length, 4);
+      });
+    });
+
+  });
+
+});

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/components.react.jsx 
b/app/addons/fauxton/components.react.jsx
index 1eecb46..7847f0a 100644
--- a/app/addons/fauxton/components.react.jsx
+++ b/app/addons/fauxton/components.react.jsx
@@ -14,6 +14,7 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'ZeroClipboard',
   'libs/react-bootstrap',
 
@@ -21,7 +22,7 @@ define([
   'velocity.ui'
 ],
 
-function (app, FauxtonAPI, React, ZeroClipboard, ReactBootstrap) {
+function (app, FauxtonAPI, React, ReactDOM, ZeroClipboard, ReactBootstrap) {
 
   var Modal = ReactBootstrap.Modal;
 
@@ -60,7 +61,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, 
ReactBootstrap) {
     },
 
     componentDidMount: function () {
-      var el = React.findDOMNode(this);
+      var el = ReactDOM.findDOMNode(this);
       this.clipboard = new ZeroClipboard(el);
       this.clipboard.on('load', function () {
         this.clipboard.on('mouseup', function () {
@@ -94,7 +95,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, 
ReactBootstrap) {
     },
 
     componentDidMount: function () {
-      var el = React.findDOMNode(this.refs["copy-text-" + 
this.props.uniqueKey]);
+      var el = ReactDOM.findDOMNode(this.refs["copy-text-" + 
this.props.uniqueKey]);
       this.clipboard = new ZeroClipboard(el);
       this.clipboard.on('load', function () {
         this.clipboard.on('mouseup', function () {
@@ -215,7 +216,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, 
ReactBootstrap) {
 
     show: function (done) {
       this.setState({show: true});
-      
$(React.findDOMNode(this.refs.myself)).velocity('transition.slideDownIn', 
FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
+      
$(ReactDOM.findDOMNode(this.refs.myself)).velocity('transition.slideDownIn', 
FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
         if (done) {
           done(true);
         }
@@ -223,7 +224,7 @@ function (app, FauxtonAPI, React, ZeroClipboard, 
ReactBootstrap) {
     },
 
     hide: function (done) {
-      $(React.findDOMNode(this.refs.myself)).velocity('reverse', 
FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
+      $(ReactDOM.findDOMNode(this.refs.myself)).velocity('reverse', 
FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED, function () {
         this.setState({show: false});
         if (done) {
           done(false);

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/navigation/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/navigation/components.react.jsx 
b/app/addons/fauxton/navigation/components.react.jsx
index 0310530..bc06215 100644
--- a/app/addons/fauxton/navigation/components.react.jsx
+++ b/app/addons/fauxton/navigation/components.react.jsx
@@ -13,11 +13,12 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/fauxton/navigation/stores',
   'addons/fauxton/navigation/actions'
 ],
 
-function (app, FauxtonAPI, React, Stores, Actions) {
+function (app, FauxtonAPI, React, ReactDOM, Stores, Actions) {
   var navBarStore = Stores.navBarStore;
 
   var Footer = React.createClass({
@@ -152,7 +153,7 @@ function (app, FauxtonAPI, React, Stores, Actions) {
 
   return {
     renderNavBar: function (el) {
-      React.render(<NavBar/>, el);
+      ReactDOM.render(<NavBar/>, el);
     },
     NavBar: NavBar,
     Burger: Burger

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx 
b/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
index 2820ef4..2b4708c 100644
--- a/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
+++ b/app/addons/fauxton/navigation/tests/componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'core/auth',
   'addons/auth/base',
   'testUtils',
-  "react"
-], function (FauxtonAPI, Views, Actions, Auth, BaseAuth, utils, React) {
+  "react",
+  'react-dom'
+], function (FauxtonAPI, Views, Actions, Auth, BaseAuth, utils, React, 
ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -34,11 +35,11 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('dispatch TOGGLE_NAVBAR_MENU on click', function () {
-        TestUtils.Simulate.click(burgerEl.getDOMNode());
+        TestUtils.Simulate.click(ReactDOM.findDOMNode(burgerEl));
         assert.ok(toggleMenu.calledOnce);
       });
 
@@ -57,13 +58,13 @@ define([
       FauxtonAPI.session.trigger('change');
 
       // confirm the logout link is present
-      var matches = React.findDOMNode(el).outerHTML.match(/Logout/);
+      var matches = ReactDOM.findDOMNode(el).outerHTML.match(/Logout/);
       assert.equal(matches.length, 1);
 
       // now confirm there's still only a single logout link after publishing 
multiple
       FauxtonAPI.session.trigger('change');
       FauxtonAPI.session.trigger('change');
-      matches = React.findDOMNode(el).outerHTML.match(/Logout/);
+      matches = ReactDOM.findDOMNode(el).outerHTML.match(/Logout/);
       assert.equal(matches.length, 1);
 
       FauxtonAPI.session.isLoggedIn.restore();

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/notifications/notifications.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/notifications/notifications.react.jsx 
b/app/addons/fauxton/notifications/notifications.react.jsx
index 443e687..2991a6f 100644
--- a/app/addons/fauxton/notifications/notifications.react.jsx
+++ b/app/addons/fauxton/notifications/notifications.react.jsx
@@ -14,6 +14,7 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'addons/fauxton/notifications/actions',
   'addons/fauxton/notifications/stores',
   'addons/fauxton/components.react',
@@ -22,7 +23,7 @@ define([
   'velocity.ui'
 ],
 
-function (app, FauxtonAPI, React, Actions, Stores, Components) {
+function (app, FauxtonAPI, React, ReactDOM, Actions, Stores, Components) {
 
   var notificationStore = Stores.notificationStore;
   var Clipboard = Components.Clipboard;
@@ -197,18 +198,18 @@ function (app, FauxtonAPI, React, Actions, Stores, 
Components) {
         show = this.props.item.type === this.props.filter;
       }
       if (show) {
-        $(React.findDOMNode(this)).velocity({ opacity: 1, height: 
this.state.elementHeight }, this.props.transitionSpeed);
+        $(ReactDOM.findDOMNode(this)).velocity({ opacity: 1, height: 
this.state.elementHeight }, this.props.transitionSpeed);
         return;
       }
       this.hide();
     },
 
     getHeight: function () {
-      return $(React.findDOMNode(this)).outerHeight(true);
+      return $(ReactDOM.findDOMNode(this)).outerHeight(true);
     },
 
     hide: function (onHidden) {
-      $(React.findDOMNode(this)).velocity({ opacity: 0, height: 0 }, 
this.props.transitionSpeed, function () {
+      $(ReactDOM.findDOMNode(this)).velocity({ opacity: 0, height: 0 }, 
this.props.transitionSpeed, function () {
         if (onHidden) {
           onHidden();
         }
@@ -255,7 +256,7 @@ function (app, FauxtonAPI, React, Actions, Stores, 
Components) {
     NotificationRow: NotificationRow,
 
     renderNotificationCenter: function (el) {
-      return React.render(<NotificationCenterPanel />, el);
+      return ReactDOM.render(<NotificationCenterPanel />, el);
     }
   };
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx 
b/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
index b72eac5..ab8d432 100644
--- a/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
+++ b/app/addons/fauxton/notifications/tests/componentsSpec.react.jsx
@@ -15,8 +15,9 @@ define([
   'addons/fauxton/notifications/stores',
   'testUtils',
   'react',
+  'react-dom',
   'moment'
-], function (FauxtonAPI, Views, Stores, utils, React, moment) {
+], function (FauxtonAPI, Views, Stores, utils, React, ReactDOM, moment) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -52,7 +53,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('shows all notification types when "all" filter applied', function () {
@@ -60,22 +61,22 @@ define([
         <Views.NotificationRow filter="all" item={notifications.success} />,
         container
       );
-      assert.equal($(row1.getDOMNode()).attr('aria-hidden'), 'false');
-      React.unmountComponentAtNode(container);
+      assert.equal($(ReactDOM.findDOMNode(row1)).attr('aria-hidden'), 'false');
+      ReactDOM.unmountComponentAtNode(container);
 
       var row2 = TestUtils.renderIntoDocument(
         <Views.NotificationRow filter="all" item={notifications.error} />,
         container
       );
-      assert.equal($(row2.getDOMNode()).attr('aria-hidden'), 'false');
-      React.unmountComponentAtNode(container);
+      assert.equal($(ReactDOM.findDOMNode(row2)).attr('aria-hidden'), 'false');
+      ReactDOM.unmountComponentAtNode(container);
 
       var row3 = TestUtils.renderIntoDocument(
         <Views.NotificationRow filter="all" item={notifications.info} />,
         container
       );
-      assert.equal($(row3.getDOMNode()).attr('aria-hidden'), 'false');
-      React.unmountComponentAtNode(container);
+      assert.equal($(ReactDOM.findDOMNode(row3)).attr('aria-hidden'), 'false');
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('hides notification when filter doesn\'t match', function () {
@@ -83,7 +84,7 @@ define([
         <Views.NotificationRow filter="success" item={notifications.info} />,
         container
       );
-      assert.equal($(rowEl.getDOMNode()).attr('aria-hidden'), 'true');
+      assert.equal($(ReactDOM.findDOMNode(rowEl)).attr('aria-hidden'), 'true');
     });
 
     it('shows notification when filter exact match', function () {
@@ -91,7 +92,7 @@ define([
         <Views.NotificationRow filter="info" item={notifications.info} />,
         container
       );
-      assert.equal($(rowEl.getDOMNode()).attr('aria-hidden'), 'false');
+      assert.equal($(ReactDOM.findDOMNode(rowEl)).attr('aria-hidden'), 
'false');
     });
 
   });
@@ -106,7 +107,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('shows all notifications by default', function () {
@@ -118,7 +119,7 @@ define([
       store.addNotification({ type: 'error', msg: 'Error #3' });
 
       var panelEl = 
TestUtils.renderIntoDocument(<Views.NotificationCenterPanel />, container);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list 
li[aria-hidden=false]').length, 6);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list 
li[aria-hidden=false]').length, 6);
     });
 
     it('clicking on a filter icon filters applies appropriate filter', 
function () {
@@ -132,16 +133,16 @@ define([
       var panelEl = 
TestUtils.renderIntoDocument(<Views.NotificationCenterPanel />, container);
 
       // there are 2 success messages
-      
TestUtils.Simulate.click($(panelEl.getDOMNode()).find('.notification-filter 
li[data-filter="success"]')[0]);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list 
li[aria-hidden=false]').length, 2);
+      
TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('.notification-filter
 li[data-filter="success"]')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list 
li[aria-hidden=false]').length, 2);
 
       // 3 errors
-      
TestUtils.Simulate.click($(panelEl.getDOMNode()).find('.notification-filter 
li[data-filter="error"]')[0]);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list 
li[aria-hidden=false]').length, 3);
+      
TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('.notification-filter
 li[data-filter="error"]')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list 
li[aria-hidden=false]').length, 3);
 
       // 1 info
-      
TestUtils.Simulate.click($(panelEl.getDOMNode()).find('.notification-filter 
li[data-filter="info"]')[0]);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list 
li[aria-hidden=false]').length, 1);
+      
TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('.notification-filter
 li[data-filter="info"]')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list 
li[aria-hidden=false]').length, 1);
     });
 
     it('clear all clears all notifications', function () {
@@ -151,10 +152,10 @@ define([
       store.addNotification({ type: 'error', msg: 'Error #3' });
 
       var panelEl = 
TestUtils.renderIntoDocument(<Views.NotificationCenterPanel />, container);
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list 
li[aria-hidden=false]').length, 4);
-      TestUtils.Simulate.click($(panelEl.getDOMNode()).find('footer 
input')[0]);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list 
li[aria-hidden=false]').length, 4);
+      TestUtils.Simulate.click($(ReactDOM.findDOMNode(panelEl)).find('footer 
input')[0]);
 
-      assert.equal($(panelEl.getDOMNode()).find('.notification-list 
li[aria-hidden=false]').length, 0);
+      assert.equal($(ReactDOM.findDOMNode(panelEl)).find('.notification-list 
li[aria-hidden=false]').length, 0);
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/fauxton/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/tests/componentsSpec.react.jsx 
b/app/addons/fauxton/tests/componentsSpec.react.jsx
index 3c7870f..fe77e8a 100644
--- a/app/addons/fauxton/tests/componentsSpec.react.jsx
+++ b/app/addons/fauxton/tests/componentsSpec.react.jsx
@@ -13,8 +13,9 @@ define([
   'api',
   'addons/fauxton/components.react',
   'testUtils',
-  'react'
-], function (FauxtonAPI, Views, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -37,7 +38,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
       FauxtonAPI.constants.MISC.TRAY_TOGGLE_SPEED = oldToggleSpeed;
     });
 
@@ -94,7 +95,7 @@ define([
           var trayEl = this.refs.tray;
           var externalEl = this.refs.externalElement;
           trayEl.show(function () {
-            TestUtils.Simulate.click(React.findDOMNode(externalEl));
+            TestUtils.Simulate.click(ReactDOM.findDOMNode(externalEl));
             assert.ok(spy.calledOnce);
           });
         },
@@ -112,7 +113,7 @@ define([
       var reactEl = TestUtils.renderIntoDocument(React.createElement(wrapper), 
container);
       reactEl.runTest();
 
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
   });
@@ -131,7 +132,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('renders 20-wise pages per default', function () {
@@ -218,7 +219,7 @@ define([
         <Views.Pagination page={1} total={100} onClick={spy} />,
         container
       );
-      var links = React.findDOMNode(pageEl).getElementsByTagName("a");
+      var links = ReactDOM.findDOMNode(pageEl).getElementsByTagName("a");
 
       TestUtils.Simulate.click(links[3]);
 
@@ -237,7 +238,7 @@ define([
         <Views.Pagination page={currentPage} total={200} onClick={spy} />,
         container
       );
-      var links = React.findDOMNode(pageEl).getElementsByTagName("a");
+      var links = ReactDOM.findDOMNode(pageEl).getElementsByTagName("a");
 
       TestUtils.Simulate.click(links[0]);
       assert.ok(spy.calledWith(currentPage - 1));
@@ -256,22 +257,22 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('shows a clipboard icon by default', function () {
       var clipboard = TestUtils.renderIntoDocument(<Views.Clipboard text="copy 
me" />, container);
-      assert.equal($(clipboard.getDOMNode()).find('.icon-paste').length, 1);
+      
assert.equal($(ReactDOM.findDOMNode(clipboard)).find('.icon-paste').length, 1);
     });
 
     it('shows text if specified', function () {
       var clipboard = TestUtils.renderIntoDocument(<Views.Clipboard 
displayType="text" text="copy me" />, container);
-      assert.equal($(clipboard.getDOMNode()).find('.icon-paste').length, 0);
+      
assert.equal($(ReactDOM.findDOMNode(clipboard)).find('.icon-paste').length, 0);
     });
 
     it('shows custom text if specified ', function () {
       var clipboard = TestUtils.renderIntoDocument(<Views.Clipboard 
displayType="text" textDisplay='booyah!' text="copy me" />, container);
-      assert.ok(/booyah!/.test($(clipboard.getDOMNode())[0].outerHTML));
+      
assert.ok(/booyah!/.test($(ReactDOM.findDOMNode(clipboard))[0].outerHTML));
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/permissions/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/permissions/tests/componentsSpec.react.jsx 
b/app/addons/permissions/tests/componentsSpec.react.jsx
index 795f4cb..2b2feb6 100644
--- a/app/addons/permissions/tests/componentsSpec.react.jsx
+++ b/app/addons/permissions/tests/componentsSpec.react.jsx
@@ -16,8 +16,9 @@ define([
   'addons/permissions/components.react',
   'addons/permissions/actions',
   'testUtils',
-  "react"
-  ], function (FauxtonAPI, Databases, Permissions, Views, Actions, utils, 
React) {
+  "react",
+  'react-dom'
+  ], function (FauxtonAPI, Databases, Permissions, Views, Actions, utils, 
React, ReactDOM) {
     var assert = utils.assert;
     var restore = utils.restore;
     var TestUtils = React.addons.TestUtils;
@@ -50,7 +51,7 @@ define([
         });
 
         afterEach(function () {
-          React.unmountComponentAtNode(container);
+          ReactDOM.unmountComponentAtNode(container);
         });
 
         it('on Add triggers add action', function () {
@@ -81,17 +82,17 @@ define([
         });
 
         afterEach(function () {
-          React.unmountComponentAtNode(container);
+          ReactDOM.unmountComponentAtNode(container);
         });
 
         it('adds user on submit', function () {
-          var input = $(el.getDOMNode()).find('input')[0];
+          var input = $(ReactDOM.findDOMNode(el)).find('input')[0];
           TestUtils.Simulate.change(input, {
             target: {
               value: 'newusername'
             }
           });
-          var form = $(el.getDOMNode()).find('.permission-item-form')[0];
+          var form = 
$(ReactDOM.findDOMNode(el)).find('.permission-item-form')[0];
           TestUtils.Simulate.submit(form);
 
           var options = addSpy.args[0][0];
@@ -101,13 +102,13 @@ define([
         });
 
         it('adds role on submit', function () {
-          var input = $(el.getDOMNode()).find('input')[1];
+          var input = $(ReactDOM.findDOMNode(el)).find('input')[1];
           TestUtils.Simulate.change(input, {
             target: {
               value: 'newrole'
             }
           });
-          var form = $(el.getDOMNode()).find('.permission-item-form')[1];
+          var form = 
$(ReactDOM.findDOMNode(el)).find('.permission-item-form')[1];
           TestUtils.Simulate.submit(form);
 
           var options = addSpy.args[0][0];
@@ -118,7 +119,7 @@ define([
 
         it('stores new name on change', function () {
           var newName = 'newName';
-          var dom = $(el.getDOMNode()).find('.item')[0];
+          var dom = $(ReactDOM.findDOMNode(el)).find('.item')[0];
 
           TestUtils.Simulate.change(dom, {
             target: {
@@ -131,7 +132,7 @@ define([
 
         it('stores new role on change', function () {
           var newRole = 'newRole';
-          var dom = $(el.getDOMNode()).find('.item')[1];
+          var dom = $(ReactDOM.findDOMNode(el)).find('.item')[1];
 
           TestUtils.Simulate.change(dom, {
             target: {
@@ -153,11 +154,11 @@ define([
         });
 
         afterEach(function () {
-          React.unmountComponentAtNode(container);
+          ReactDOM.unmountComponentAtNode(container);
         });
 
         it('triggers remove on click', function () {
-          var dom = $(el.getDOMNode()).find('.close')[0];
+          var dom = $(ReactDOM.findDOMNode(el)).find('.close')[0];
           TestUtils.Simulate.click(dom);
 
           assert.ok(removeSpy.calledOnce);

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/setup/tests/setupComponentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/setup/tests/setupComponentsSpec.react.jsx 
b/app/addons/setup/tests/setupComponentsSpec.react.jsx
index ead1f98..b6a8b86 100644
--- a/app/addons/setup/tests/setupComponentsSpec.react.jsx
+++ b/app/addons/setup/tests/setupComponentsSpec.react.jsx
@@ -14,8 +14,9 @@ define([
   'addons/setup/setup.react',
   'addons/setup/setup.stores',
   'testUtils',
-  'react'
-], function (FauxtonAPI, Views, Stores, utils, React) {
+  'react',
+  'react-dom'
+], function (FauxtonAPI, Views, Stores, utils, React, ReactDOM) {
 
   var assert = utils.assert;
   var TestUtils = React.addons.TestUtils;
@@ -31,7 +32,7 @@ define([
       });
 
       afterEach(function () {
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
       });
 
       it('fires callbacks on change, ip', function () {
@@ -40,7 +41,7 @@ define([
           container
         );
 
-        var node = $(optSettings.getDOMNode()).find('.setup-input-ip')[0];
+        var node = 
$(ReactDOM.findDOMNode(optSettings)).find('.setup-input-ip')[0];
         TestUtils.Simulate.change(node, {target: {value: 'Hello, world'}});
 
         assert.ok(changeHandler.calledOnce);
@@ -52,7 +53,7 @@ define([
           container
         );
 
-        var node = $(optSettings.getDOMNode()).find('.setup-input-port')[0];
+        var node = 
$(ReactDOM.findDOMNode(optSettings)).find('.setup-input-port')[0];
         TestUtils.Simulate.change(node, {target: {value: 'Hello, world'}});
 
         assert.ok(changeHandler.calledOnce);
@@ -74,12 +75,12 @@ define([
 
       afterEach(function () {
         utils.restore(Stores.setupStore.getIsAdminParty);
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
         Stores.setupStore.reset();
       });
 
       it('changes the values in the store for additional nodes', function () {
-        var $addNodesSection = 
$(controller.getDOMNode()).find('.setup-add-nodes-section');
+        var $addNodesSection = 
$(ReactDOM.findDOMNode(controller)).find('.setup-add-nodes-section');
         TestUtils.Simulate.change($addNodesSection.find('.setup-input-ip')[0], 
{target: {value: '192.168.13.37'}});
         
TestUtils.Simulate.change($addNodesSection.find('.setup-input-port')[0], 
{target: {value: '1337'}});
         
TestUtils.Simulate.change($addNodesSection.find('.input-remote-node')[0], 
{target: {value: 'node2.local'}});
@@ -91,7 +92,7 @@ define([
       });
 
       it('changes the values in the store for the setup node', function () {
-        var $setupNodesSection = 
$(controller.getDOMNode()).find('.setup-setupnode-section');
+        var $setupNodesSection = 
$(ReactDOM.findDOMNode(controller)).find('.setup-setupnode-section');
         
TestUtils.Simulate.change($setupNodesSection.find('.setup-input-ip')[0], 
{target: {value: '192.168.42.42'}});
         
TestUtils.Simulate.change($setupNodesSection.find('.setup-input-port')[0], 
{target: {value: '4242'}});
         
TestUtils.Simulate.change($setupNodesSection.find('.setup-username')[0], 
{target: {value: 'tester'}});
@@ -120,12 +121,12 @@ define([
 
       afterEach(function () {
         utils.restore(Stores.setupStore.getIsAdminParty);
-        React.unmountComponentAtNode(container);
+        ReactDOM.unmountComponentAtNode(container);
         Stores.setupStore.reset();
       });
 
       it('changes the values in the store for the setup node', function () {
-        var $setupNodesSection = 
$(controller.getDOMNode()).find('.setup-setupnode-section');
+        var $setupNodesSection = 
$(ReactDOM.findDOMNode(controller)).find('.setup-setupnode-section');
         
TestUtils.Simulate.change($setupNodesSection.find('.setup-input-ip')[0], 
{target: {value: '192.168.13.42'}});
         
TestUtils.Simulate.change($setupNodesSection.find('.setup-input-port')[0], 
{target: {value: '1342'}});
         
TestUtils.Simulate.change($setupNodesSection.find('.setup-username')[0], 
{target: {value: 'tester'}});

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/addons/verifyinstall/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/verifyinstall/tests/componentsSpec.react.jsx 
b/app/addons/verifyinstall/tests/componentsSpec.react.jsx
index e345a70..b0a48bc 100644
--- a/app/addons/verifyinstall/tests/componentsSpec.react.jsx
+++ b/app/addons/verifyinstall/tests/componentsSpec.react.jsx
@@ -14,11 +14,12 @@ define([
   'app',
   'api',
   'react',
+  'react-dom',
   'testUtils',
   'addons/verifyinstall/constants',
   'addons/verifyinstall/components.react'
 
-], function (app, FauxtonAPI, React, testUtils, Constants, Components) {
+], function (app, FauxtonAPI, React, ReactDOM, testUtils, Constants, 
Components) {
   FauxtonAPI.router = new FauxtonAPI.Router([]);
 
   var assert = testUtils.assert;
@@ -43,7 +44,7 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('confirm all result fields blank before tests ran', function () {
@@ -51,7 +52,7 @@ define([
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallResults 
testResults={testResults} />, container);
 
       tests.forEach(function (test) {
-        assert.equal($(el.getDOMNode()).find('#' + test.id).html(), '');
+        assert.equal($(ReactDOM.findDOMNode(el)).find('#' + test.id).html(), 
'');
       });
     });
 
@@ -68,7 +69,7 @@ define([
         el = 
ReactTestUtils.renderIntoDocument(<Components.VerifyInstallResults 
testResults={copy} />, container);
 
         // now look at the DOM for that element. It should contain a tick char
-        assert.equal($(el.getDOMNode()).find('#' + test.id + ' span').html(), 
'✓');
+        assert.equal($(ReactDOM.findDOMNode(el)).find('#' + test.id + ' 
span').html(), '✓');
       });
     });
 
@@ -85,7 +86,7 @@ define([
         el = 
ReactTestUtils.renderIntoDocument(<Components.VerifyInstallResults 
testResults={copy} />, container);
 
         // now look at the DOM for that element. It should contain an error 
char
-        assert.equal($(el.getDOMNode()).find('#' + test.id + ' span').html(), 
'✗');
+        assert.equal($(ReactDOM.findDOMNode(el)).find('#' + test.id + ' 
span').html(), '✗');
       });
     });
   });
@@ -99,14 +100,14 @@ define([
     });
 
     afterEach(function () {
-      React.unmountComponentAtNode(container);
+      ReactDOM.unmountComponentAtNode(container);
     });
 
     it('calls verify function on click', function () {
       var stub = { func: function () { } };
       var spy = sinon.spy(stub, 'func');
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton 
verify={stub.func} isVerifying={false} />, container);
-      ReactTestUtils.Simulate.click($(el.getDOMNode())[0]);
+      ReactTestUtils.Simulate.click($(ReactDOM.findDOMNode(el))[0]);
       assert.ok(spy.calledOnce);
     });
 
@@ -114,20 +115,20 @@ define([
       var stub = { func: function () { } };
       var spy = sinon.spy(stub, 'func');
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton 
verify={stub.func} isVerifying={true} />, container);
-      ReactTestUtils.Simulate.click($(el.getDOMNode())[0]);
+      ReactTestUtils.Simulate.click($(ReactDOM.findDOMNode(el))[0]);
       assert.notOk(spy.calledOnce);
     });
 
     it('shows appropriate default label', function () {
       var stub = { func: function () { } };
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton 
verify={stub.func} isVerifying={false} />, container);
-      assert.equal($(el.getDOMNode()).html(), 'Verify Installation');
+      assert.equal($(ReactDOM.findDOMNode(el)).html(), 'Verify Installation');
     });
 
     it('shows appropriate label during verification', function () {
       var stub = { func: function () { } };
       el = ReactTestUtils.renderIntoDocument(<Components.VerifyInstallButton 
verify={stub.func} isVerifying={true} />, container);
-      assert.equal($(el.getDOMNode()).html(), 'Verifying');
+      assert.equal($(ReactDOM.findDOMNode(el)).html(), 'Verifying');
     });
 
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/config.js
----------------------------------------------------------------------
diff --git a/app/config.js b/app/config.js
index 8f289e6..8097509 100644
--- a/app/config.js
+++ b/app/config.js
@@ -35,6 +35,7 @@ require.config({
     "velocity.ui": "../assets/js/plugins/velocity.ui",
     "react-autocomplete": "../assets/js/plugins/react-autocomplete",
     react: "../assets/js/libs/react",
+    'react-dom': "../assets/js/libs/react-dom",
     flux: "../assets/js/libs/flux",
     "es5-shim": "../assets/js/libs/es5-shim",
     "css.escape": "../assets/js/libs/css.escape",

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/core/routeObject.js
----------------------------------------------------------------------
diff --git a/app/core/routeObject.js b/app/core/routeObject.js
index 79f6f28..7e82dc1 100644
--- a/app/core/routeObject.js
+++ b/app/core/routeObject.js
@@ -13,9 +13,10 @@
 define([
   'core/base',
   'react',
+  'react-dom',
   'backbone'
 ],
-function (FauxtonAPI, React, Backbone) {
+function (FauxtonAPI, React, ReactDOM, Backbone) {
 
   var RouteObject = function (options) {
     this._options = options;
@@ -135,7 +136,7 @@ function (FauxtonAPI, React, Backbone) {
     renderReactComponents: function () {
       _.each(this.reactComponents, function (componentInfo, selector) {
         if ($(selector)[0]) {
-          React.render(React.createElement(componentInfo.component, 
componentInfo.props), $(selector)[0]);
+          ReactDOM.render(React.createElement(componentInfo.component, 
componentInfo.props), $(selector)[0]);
         }
       });
     },
@@ -260,7 +261,7 @@ function (FauxtonAPI, React, Backbone) {
     removeComponent: function (selector) {
       if (_.has(this.reactComponents, selector)) {
         if ($(selector)[0]) {
-          React.unmountComponentAtNode($(selector)[0]);
+          ReactDOM.unmountComponentAtNode($(selector)[0]);
         }
         this.reactComponents[selector] = null;
         delete this.reactComponents[selector];

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e6450a0d/app/core/tests/routeObjectSpec.js
----------------------------------------------------------------------
diff --git a/app/core/tests/routeObjectSpec.js 
b/app/core/tests/routeObjectSpec.js
index bcb8760..d32de12 100644
--- a/app/core/tests/routeObjectSpec.js
+++ b/app/core/tests/routeObjectSpec.js
@@ -12,8 +12,9 @@
 define([
   'api',
   'react',
+  'react-dom',
   'testUtils'
-], function (FauxtonAPI, React, testUtils) {
+], function (FauxtonAPI, React, ReactDOM, testUtils) {
   var assert = testUtils.assert,
       restore = testUtils.restore,
       RouteObject = FauxtonAPI.RouteObject,
@@ -196,11 +197,11 @@ define([
       describe('removeComponent', function () {
 
         afterEach(function () {
-          restore(React.unmountComponentAtNode);
+          restore(ReactDOM.unmountComponentAtNode);
         });
 
         it('removes existing components via React', function () {
-          var spy = sinon.stub(React, 'unmountComponentAtNode');
+          var spy = sinon.stub(ReactDOM, 'unmountComponentAtNode');
           var fakeSelector = 'remove-selector';
 
           var container = document.createElement('div');
@@ -220,7 +221,7 @@ define([
         });
 
         it('removes existing components key', function () {
-          var spy = sinon.stub(React, 'unmountComponentAtNode');
+          var spy = sinon.stub(ReactDOM, 'unmountComponentAtNode');
           var fakeSelector = 'remove-selector';
           testRouteObject.reactComponents[fakeSelector] = 
React.createElement('div');
 
@@ -231,7 +232,7 @@ define([
         });
 
         it('does nothing for non existing component', function () {
-          var spy = sinon.spy(React, 'unmountComponentAtNode');
+          var spy = sinon.spy(ReactDOM, 'unmountComponentAtNode');
           var fakeSelector = 'remove-selector';
 
           testRouteObject.removeComponent(fakeSelector);

Reply via email to