From 8842147ec3e54088fd655d1713d0f675acb64095 Mon Sep 17 00:00:00 2001
From: Matthew Hodgson <matthew@matrix.org>
Date: Thu, 5 Nov 2015 11:21:45 +0000
Subject: [PATCH] skin RoomDropTarget correctly

---
 src/skins/vector/css/hide.css                 |  1 -
 .../vector/css/molecules/RoomDropTarget.css   | 33 ++++++++++++++-----
 src/skins/vector/css/molecules/RoomTile.css   | 14 ++++----
 src/skins/vector/css/organisms/LeftPanel.css  |  8 +++--
 src/skins/vector/css/organisms/RoomList.css   |  1 +
 .../vector/views/molecules/RoomDropTarget.js  |  9 ++---
 src/skins/vector/views/molecules/RoomTile.js  | 21 +++++++++---
 src/skins/vector/views/organisms/RoomList.js  |  8 +++--
 .../vector/views/organisms/RoomSubList.js     | 10 +++++-
 9 files changed, 72 insertions(+), 33 deletions(-)

diff --git a/src/skins/vector/css/hide.css b/src/skins/vector/css/hide.css
index 7d8ee302..f84a35b3 100644
--- a/src/skins/vector/css/hide.css
+++ b/src/skins/vector/css/hide.css
@@ -1,4 +1,3 @@
-.mx_RoomDropTarget,
 .mx_RoomSettings_encrypt,
 .mx_CreateRoom_encrypt,
 .mx_RightPanel_filebutton
diff --git a/src/skins/vector/css/molecules/RoomDropTarget.css b/src/skins/vector/css/molecules/RoomDropTarget.css
index c42d4499..549fa609 100644
--- a/src/skins/vector/css/molecules/RoomDropTarget.css
+++ b/src/skins/vector/css/molecules/RoomDropTarget.css
@@ -16,12 +16,29 @@ limitations under the License.
 
 .mx_RoomDropTarget {
     font-size: 14px;
-    text-align: center;
-    margin-left: 8px;
-    margin-right: 8px;
-    padding-top: 16px;
-    padding-bottom: 16px;
-    background-color: #fbfbfb;
-    border: 1px dashed #d7d7d7;
-    border-radius: 8px;
+    margin-left: 10px;
+    margin-right: 15px;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    border: 1px dashed #76cfa6;
+    color: #454545;
+    background-color: rgba(255,255,255,0.5);
+    border-radius: 4px;
+}
+
+.mx_RoomDropTarget_avatar {
+    background-color: #fff;
+    border-radius: 24px;
+    width: 24px;
+    height: 24px;
+    float: left;
+    margin-left: 7px;
+    margin-right: 8px;
+}
+
+.mx_RoomDropTarget_label {
+    position: relative;
+    margin-top: 3px;
+    line-height: 21px;
+    z-index: 1;
 }
diff --git a/src/skins/vector/css/molecules/RoomTile.css b/src/skins/vector/css/molecules/RoomTile.css
index f2c1daad..b6255225 100644
--- a/src/skins/vector/css/molecules/RoomTile.css
+++ b/src/skins/vector/css/molecules/RoomTile.css
@@ -22,7 +22,6 @@ limitations under the License.
 
 .mx_RoomTile_avatar {
     display: table-cell;
-    background: #eaf5f0;
     padding-right: 8px;
     padding-top: 4px;
     padding-bottom: 2px;
@@ -43,13 +42,11 @@ limitations under the License.
     overflow: hidden;
     text-overflow: ellipsis;
     padding-right: 16px;    
-    color: #454545;
-    opacity: 0.8;
+    color: rgba(69, 69, 69, 0.8);
 }
 
 .mx_RoomTile_invite {
-    opacity: 0.5;
-    font-weight: normal;
+    color: rgba(69, 69, 69, 0.5);
 }
 
 .collapsed .mx_RoomTile_name {
@@ -106,15 +103,16 @@ limitations under the License.
 
 .mx_RoomTile_unread,
 .mx_RoomTile_highlight,
-.mx_RoomTile_invited
+.mx_RoomTile_selected
 {
     font-weight: bold;
 }
 
-.mx_RoomTile_selected {
+.mx_RoomTile_selected .mx_RoomTile_name {
+    color: #76cfa6 ! important;
 }
 
-.mx_RoomTile.mx_RoomTile_selected {
+.mx_RoomTile.mx_RoomTile_selected .mx_RoomTile_name {
     background: url('img/selected.png');
     background-repeat: no-repeat;
     background-position: right center;
diff --git a/src/skins/vector/css/organisms/LeftPanel.css b/src/skins/vector/css/organisms/LeftPanel.css
index d755b216..738b0782 100644
--- a/src/skins/vector/css/organisms/LeftPanel.css
+++ b/src/skins/vector/css/organisms/LeftPanel.css
@@ -57,8 +57,10 @@ limitations under the License.
     -webkit-order: 3;
     order: 3;
 
-    -webkit-flex: 0 0 126px;
-    flex: 0 0 126px;
+    -webkit-flex: 0 0 140px;
+    flex: 0 0 140px;
+
+    background-color: rgba(118,207,166,0.19);
 }
 
 .mx_LeftPanel .mx_BottomLeftMenu .mx_RoomTile {
@@ -66,7 +68,7 @@ limitations under the License.
 }
 
 .mx_LeftPanel .mx_BottomLeftMenu .mx_BottomLeftMenu_options {
-    margin-top: 12px;
+    margin-top: 17px;
     width: 100%;
 }
 
diff --git a/src/skins/vector/css/organisms/RoomList.css b/src/skins/vector/css/organisms/RoomList.css
index 95123544..7f5e2272 100644
--- a/src/skins/vector/css/organisms/RoomList.css
+++ b/src/skins/vector/css/organisms/RoomList.css
@@ -16,6 +16,7 @@ limitations under the License.
 
 .mx_RoomList {
     padding-top: 24px;
+    padding-bottom: 12px;
 }
 
 .mx_RoomList_expandButton {
diff --git a/src/skins/vector/views/molecules/RoomDropTarget.js b/src/skins/vector/views/molecules/RoomDropTarget.js
index b1e15077..c1a2a954 100644
--- a/src/skins/vector/views/molecules/RoomDropTarget.js
+++ b/src/skins/vector/views/molecules/RoomDropTarget.js
@@ -18,15 +18,16 @@ limitations under the License.
 
 var React = require('react');
 
-//var RoomDropTargetController = require('matrix-react-sdk/lib/controllers/molecules/RoomDropTargetController')
-
 module.exports = React.createClass({
     displayName: 'RoomDropTarget',
-    // mixins: [RoomDropTargetController],
+
     render: function() {
         return (
             <div className="mx_RoomDropTarget">
-                {this.props.text}
+                <div className="mx_RoomDropTarget_avatar"></div>
+                <div className="mx_RoomDropTarget_label">
+                    { this.props.label }
+                </div>
             </div>
         );
     }
diff --git a/src/skins/vector/views/molecules/RoomTile.js b/src/skins/vector/views/molecules/RoomTile.js
index 383c08d1..ad198694 100644
--- a/src/skins/vector/views/molecules/RoomTile.js
+++ b/src/skins/vector/views/molecules/RoomTile.js
@@ -32,6 +32,10 @@ var sdk = require('matrix-react-sdk')
  * Only `beginDrag` function is required.
  */
 var roomTileSource = {
+    canDrag: function(props, monitor) {
+        return props.roomSubList.props.editable;
+    },
+
     beginDrag: function (props) {
         // Return the data describing the dragged item
         var item = {
@@ -60,8 +64,6 @@ var roomTileSource = {
             return;
         }
         else {
-            // if it's not manual ordering, we'll need to position the tile correctly here according to the right ordering
-
             // When dropped on a compatible target, actually set the right tags for the new ordering
             // persistNewOrder(item.room, dropResult.listId);
         }
@@ -86,9 +88,18 @@ var roomTileTarget = {
             item.targetList = props.roomSubList;
         }
 
-        if (item.targetList.props.order === 'manual' && item.room.roomId !== props.room.roomId) {
-            var roomTile = props.roomSubList.findRoomTile(props.room);
-            props.roomSubList.moveRoomTile(item.room, roomTile.index);
+        if (item.targetList.props.order === 'manual') {
+            if (item.room.roomId !== props.room.roomId) {
+                var roomTile = props.roomSubList.findRoomTile(props.room);
+                props.roomSubList.moveRoomTile(item.room, roomTile.index);
+            }
+        }
+        else {
+            if (!props.roomSubList.findRoomTile(item.room).room) {
+                // add to the list in the right place
+                props.roomSubList.moveRoomTile(item.room, 0);
+                props.roomSubList.sortList();
+            }
         }
     },
 };
diff --git a/src/skins/vector/views/organisms/RoomList.js b/src/skins/vector/views/organisms/RoomList.js
index 81d23867..2e46c42f 100644
--- a/src/skins/vector/views/organisms/RoomList.js
+++ b/src/skins/vector/views/organisms/RoomList.js
@@ -54,6 +54,7 @@ module.exports = React.createClass({
                 <RoomSubList list={ this.state.lists['favourites'] }
                              label="Favourites"
                              tagname="favourites"
+                             verb="favourite"
                              editable={ true }
                              order="manual"
                              activityMap={ this.state.activityMap }
@@ -68,9 +69,10 @@ module.exports = React.createClass({
                              selectedRoom={ this.props.selectedRoom }
                              collapsed={ this.props.collapsed } />
 
-                <RoomSubList list={ this.state.lists['lurking'] }
-                             label="Others"
-                             tagname="secondary"
+                <RoomSubList list={ this.state.lists['hidden'] }
+                             label="Hidden"
+                             tagname="hidden"
+                             verb="hide"
                              editable={ true }
                              order="recent"
                              activityMap={ this.state.activityMap }
diff --git a/src/skins/vector/views/organisms/RoomSubList.js b/src/skins/vector/views/organisms/RoomSubList.js
index 68d55c7b..b5655e37 100644
--- a/src/skins/vector/views/organisms/RoomSubList.js
+++ b/src/skins/vector/views/organisms/RoomSubList.js
@@ -63,7 +63,7 @@ var RoomSubList = React.createClass({
     },
 
     componentWillMount: function() {
-        this.sortList(this.props.list, this.props.order);
+        this.sortList();
     },
 
     componentWillReceiveProps: function(newProps) {
@@ -94,6 +94,8 @@ var RoomSubList = React.createClass({
     },
 
     sortList: function(list, order) {
+        if (list === undefined) list = this.props.list;
+        if (order === undefined) order = this.props.order;
         var comparator;
         list = list || [];
         if (order === "manual") comparator = this.manualComparator;
@@ -178,11 +180,17 @@ var RoomSubList = React.createClass({
 
         //console.log("render: " + JSON.stringify(this.state.sortedList));
 
+        var target;
+        if (this.state.sortedList.length == 0 && this.props.editable) {
+            target = <RoomDropTarget label={ 'Drop here to ' + this.props.verb }/>;
+        }
+
         if (this.state.sortedList.length > 0 || this.props.editable) {
             return connectDropTarget(
                 <div>
                     <h2 className="mx_RoomSubList_label">{ this.props.collapsed ? '' : this.props.label }</h2>
                     <div className="mx_RoomSubList">
+                        { target }
                         { this.makeRoomTiles() }
                     </div>
                 </div>