create common tablelement

create a tab component for all future tabs

PR: #714
PR-URL: https://github.com/apache/couchdb-fauxton/pull/714
Reviewed-By: garren smith <garren.sm...@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/58a1ac7e
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/58a1ac7e
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/58a1ac7e

Branch: refs/heads/master
Commit: 58a1ac7eeda5bccb961083a349ade2136d61a911
Parents: 9ac2d75
Author: Robert Kowalski <robertkowal...@apache.org>
Authored: Mon May 23 17:10:42 2016 +0200
Committer: Robert Kowalski <robertkowal...@apache.org>
Committed: Tue May 24 19:45:27 2016 +0200

----------------------------------------------------------------------
 .../activetasks/assets/less/activetasks.less    | 32 +---------
 app/addons/activetasks/components.react.jsx     | 37 +++++-------
 .../tests/activetasks.componentsSpec.react.jsx  | 22 +++----
 .../components/assets/less/components.less      |  1 +
 .../components/assets/less/tab-element.less     | 61 ++++++++++++++++++++
 .../components/react-components.react.jsx       | 36 +++++++++++-
 6 files changed, 126 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/58a1ac7e/app/addons/activetasks/assets/less/activetasks.less
----------------------------------------------------------------------
diff --git a/app/addons/activetasks/assets/less/activetasks.less 
b/app/addons/activetasks/assets/less/activetasks.less
index 8ae0199..a7620a2 100644
--- a/app/addons/activetasks/assets/less/activetasks.less
+++ b/app/addons/activetasks/assets/less/activetasks.less
@@ -98,43 +98,17 @@
     min-width: 770px;
 
     input {
-      display:none;
-    }
-
-    li {
-      background-color: #eee;
-      margin-top: 25px;
-      margin-left: 3px;
-
-      &.active-tasks-checked {
-        background-color: @linkColorHover;
-
-        label {
-          color: #fff;
-        }
-      };
-
-      &:hover {
-        color: @linkColorHover;
-      };
-
-      label {
-        height: 35px;
-        width: 100%;
-        line-height: 35px;
-        text-align: center;
-        .noselect()
-      }
+      display: none;
     }
 
     #active-tasks-search-box {
       display: inline;
       font-size: 14px;
       font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-      height: 36px;
+      height: 51px;
       background-color: #eee;
       width: 200px;
-      margin: 0px;
+      margin: 9px 0 0 0;
 
       &:focus {
         background-color: #fff;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/58a1ac7e/app/addons/activetasks/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/activetasks/components.react.jsx 
b/app/addons/activetasks/components.react.jsx
index 4809655..d352175 100644
--- a/app/addons/activetasks/components.react.jsx
+++ b/app/addons/activetasks/components.react.jsx
@@ -18,12 +18,17 @@ define([
   './stores',
   './resources',
   './actions',
+
   '../components/react-components.react',
   '../fauxton/components.react',
   'react-addons-css-transition-group'
-], function (app, FauxtonAPI, React, ReactDOM, Stores, Resources, Actions, 
Components, ComponentsReact, ReactCSSTransitionGroup) {
+], (app, FauxtonAPI, React, ReactDOM, Stores, Resources, Actions,
+  Components, ComponentsReact, ReactCSSTransitionGroup) => {
+
+  const TabElement = Components.TabElement;
 
   var activeTasksStore = Stores.activeTasksStore;
+
   var ActiveTasksController = React.createClass({
 
     getStoreState: function () {
@@ -125,31 +130,17 @@ define([
 
     createFilterTabs: function () {
       return (
-        this.props.radioNames.map(function (radioName) {
-          var checked = this.checked(radioName);
-          var id = radioName.replace(' ', '-');
-          var radioClassName = "radio-" + id;
-          var radioClick = this.onRadioClick;
-          var checkedClassName = checked ? 'active-tasks-checked' : '';
+        this.props.radioNames.map((radioName, i) => {
+          const checked = this.checked(radioName);
 
           return (
-            <li className={"active-tasks-one-checkbox " + checkedClassName} 
key={radioName + "li"}>
-              <input
-                  className="toggle-filter-tab"
-                  data-bypass="true"
-                  id={id}
-                  type="radio"
-                  key ={radioName}
-                  name="radio-button-active-task-filter-tray"
-                  value={radioName}
-                  checked={checked}
-                  onChange={radioClick} />
-              <label htmlFor={id} className="active-tasks-checkbox-label">
-              {radioName}
-              </label>
-            </li>
+            <TabElement
+              key={i}
+              selected={checked}
+              text={radioName}
+              onChange={this.onRadioClick} />
           );
-        }.bind(this))
+        })
       );
     },
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/58a1ac7e/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx 
b/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
index 65189d7..4029e48 100644
--- a/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
+++ b/app/addons/activetasks/tests/activetasks.componentsSpec.react.jsx
@@ -62,10 +62,6 @@ define([
         tableDiv = document.createElement('div');
         activeTasksStore.initAfterFetching(activeTasksCollection.table, 
activeTasksCollection);
         table = TestUtils.renderIntoDocument(<Components.ActiveTasksController 
/>, tableDiv);
-
-        // open filter tray
-        //filterTab = TestUtils.findRenderedDOMComponentWithClass(table, 
'toggle-filter-tab');
-        //TestUtils.Simulate.click(filterTab);
       });
 
       afterEach(function () {
@@ -80,18 +76,24 @@ define([
           restore(Actions.setSearchTerm);
         });
 
-        var radioIDs = [
+        const radioTexts = [
           'Replication',
-          'Database-Compaction',
+          'Database Compaction',
           'Indexer',
-          'View-Compaction'
+          'View Compaction'
         ];
 
-        it('should trigger change to radio buttons', function () {
-          _.each(radioIDs, function (radioID) {
+        it('should trigger change to radio buttons', () => {
+
+          radioTexts.forEach((text) => {
             spy = sinon.spy(Actions, 'switchTab');
-            TestUtils.Simulate.change($(ReactDOM.findDOMNode(table)).find('#' 
+ radioID)[0]);
+
+            const $table = $(ReactDOM.findDOMNode(table));
+            const element = $table.find(`input[value="${text}"]`)[0];
+
+            TestUtils.Simulate.change(element);
             assert.ok(spy.calledOnce);
+
             spy.restore();
           });
         });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/58a1ac7e/app/addons/components/assets/less/components.less
----------------------------------------------------------------------
diff --git a/app/addons/components/assets/less/components.less 
b/app/addons/components/assets/less/components.less
index fa4fc01..1cfb2ae 100644
--- a/app/addons/components/assets/less/components.less
+++ b/app/addons/components/assets/less/components.less
@@ -20,3 +20,4 @@
 @import "bulk-selector.less";
 @import "badges.less";
 @import "modals.less";
+@import "tab-element.less";

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/58a1ac7e/app/addons/components/assets/less/tab-element.less
----------------------------------------------------------------------
diff --git a/app/addons/components/assets/less/tab-element.less 
b/app/addons/components/assets/less/tab-element.less
new file mode 100644
index 0000000..c6413e5
--- /dev/null
+++ b/app/addons/components/assets/less/tab-element.less
@@ -0,0 +1,61 @@
+// 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.
+
+@import "../../../../../assets/less/mixins.less";
+
+
+.component-tab-element {
+  background-color: #eee;
+  margin-top: 10px;
+  line-height: 40px;
+
+  label {
+    margin-right: 0;
+    line-height: 25px;
+    .noselect()
+  }
+
+  .tab-element-content {
+    padding: 8px 12px 12px 12px;
+
+  }
+
+  .tab-element-indicator-wrapper {
+    height: 5px;
+  }
+
+  .tab-element-indicator {
+    height: 0px;
+    transition: all .25s linear;
+  }
+
+  &.tab-element-checked .tab-element-indicator {
+    height: 5px;
+    background-color: @linkColorHover;
+  };
+
+  &.tab-element-checked {
+    background-color: #fff;
+  }
+
+  transition: all .25s linear;
+
+  &:hover {
+    background-color: #fff;
+    color: @linkColorHover;
+  };
+
+  &:hover .tab-element-indicator {
+    height: 5px;
+    background-color: @linkColorHover;
+  };
+}

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/58a1ac7e/app/addons/components/react-components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/react-components.react.jsx 
b/app/addons/components/react-components.react.jsx
index 7ec7f8a..e9cc587 100644
--- a/app/addons/components/react-components.react.jsx
+++ b/app/addons/components/react-components.react.jsx
@@ -1557,6 +1557,39 @@ define([
     }
   });
 
+  const TabElement = ({selected, text, onChange, iconClass}) => {
+
+    const additionalClass = selected ? 'tab-element-checked' : '';
+
+    return (
+      <li className={`component-tab-element ${additionalClass}`}>
+
+        <label>
+          <div className="tab-element-indicator-wrapper">
+            <div className="tab-element-indicator"></div>
+          </div>
+          <div className="tab-element-content">
+            <i className={iconClass}></i>
+            <input
+              type="radio"
+              value={text}
+              checked={selected}
+              onChange={onChange} />
+
+              {text}
+          </div>
+        </label>
+      </li>
+
+    );
+  };
+  TabElement.propTypes = {
+    selected: React.PropTypes.bool.isRequired,
+    text: React.PropTypes.string.isRequired,
+    onChange: React.PropTypes.func.isRequired,
+    iconClass: React.PropTypes.string,
+  };
+
   return {
     BadgeList: BadgeList,
     Badge: Badge,
@@ -1583,7 +1616,8 @@ define([
     removeMenuDropDown: function (el) {
       ReactDOM.unmountComponentAtNode(el);
     },
-    DeleteDatabaseModal: DeleteDatabaseModal
+    DeleteDatabaseModal: DeleteDatabaseModal,
+    TabElement: TabElement
   };
 
 });

Reply via email to