implement collapsible leftpanel at last
|
@ -159,6 +159,7 @@ module.exports = {
|
||||||
<RoomTile
|
<RoomTile
|
||||||
room={room}
|
room={room}
|
||||||
key={room.roomId}
|
key={room.roomId}
|
||||||
|
collapsed={self.props.collapsed}
|
||||||
selected={selected}
|
selected={selected}
|
||||||
unread={self.state.activityMap[room.roomId] === 1}
|
unread={self.state.activityMap[room.roomId] === 1}
|
||||||
highlight={self.state.activityMap[room.roomId] === 2}
|
highlight={self.state.activityMap[room.roomId] === 2}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
.mx_RoomDropTarget,
|
.mx_RoomDropTarget,
|
||||||
.mx_RoomList_favourites_label,
|
.mx_RoomList_favourites_label,
|
||||||
.mx_RoomList_archive_label,
|
.mx_RoomList_archive_label,
|
||||||
.mx_LeftPanel_hideButton,
|
|
||||||
.mx_RoomHeader_search,
|
.mx_RoomHeader_search,
|
||||||
.mx_RoomSettings_encrypt,
|
.mx_RoomSettings_encrypt,
|
||||||
.mx_CreateRoom_encrypt,
|
.mx_CreateRoom_encrypt,
|
||||||
|
|
|
@ -22,13 +22,13 @@ limitations under the License.
|
||||||
|
|
||||||
.mx_RoomTile_avatar {
|
.mx_RoomTile_avatar {
|
||||||
display: table-cell;
|
display: table-cell;
|
||||||
padding-right: 12px;
|
padding-right: 10px;
|
||||||
padding-top: 3px;
|
padding-top: 3px;
|
||||||
padding-bottom: 3px;
|
padding-bottom: 3px;
|
||||||
padding-left: 16px;
|
padding-left: 10px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
width: 40px;
|
width: 36px;
|
||||||
height: 40px;
|
height: 36px;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,31 @@ limitations under the License.
|
||||||
padding-right: 16px;
|
padding-right: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_RoomTile_tooltip {
|
||||||
|
border: 1px solid #a9dbf4;
|
||||||
|
border-radius: 8px;
|
||||||
|
background-color: #fff;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1000;
|
||||||
|
margin-top: 6px;
|
||||||
|
left: 64px;
|
||||||
|
padding: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_RoomTile_chevron {
|
||||||
|
position: absolute;
|
||||||
|
left: -9px;
|
||||||
|
top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_RoomTile_tooltip {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapsed .mx_RoomTile_name {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
.mx_RoomTile_nameBadge {
|
.mx_RoomTile_nameBadge {
|
||||||
display: table;
|
display: table;
|
||||||
|
|
|
@ -28,8 +28,16 @@ limitations under the License.
|
||||||
|
|
||||||
.mx_LeftPanel_hideButton {
|
.mx_LeftPanel_hideButton {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 18px;
|
||||||
right: 10px;
|
right: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_LeftPanel_showButton {
|
||||||
|
position: absolute;
|
||||||
|
top: 18px;
|
||||||
|
left: 16px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_LeftPanel .mx_RoomList {
|
.mx_LeftPanel .mx_RoomList {
|
||||||
|
|
|
@ -27,4 +27,5 @@ limitations under the License.
|
||||||
.mx_RoomList h2 {
|
.mx_RoomList h2 {
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
padding-right: 16px;
|
padding-right: 16px;
|
||||||
|
padding-bottom: 10px;
|
||||||
}
|
}
|
|
@ -73,6 +73,11 @@ limitations under the License.
|
||||||
flex: 0 0 230px;
|
flex: 0 0 230px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_MatrixChat .mx_LeftPanel.collapsed {
|
||||||
|
-webkit-flex: 0 0 60px;
|
||||||
|
flex: 0 0 60px;
|
||||||
|
}
|
||||||
|
|
||||||
.mx_MatrixChat .mx_MatrixChat_middlePanel {
|
.mx_MatrixChat .mx_MatrixChat_middlePanel {
|
||||||
-webkit-box-ordinal-group: 2;
|
-webkit-box-ordinal-group: 2;
|
||||||
-moz-box-ordinal-group: 2;
|
-moz-box-ordinal-group: 2;
|
||||||
|
|
Before Width: | Height: | Size: 999 B After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 331 B After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 415 B After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 200 B After Width: | Height: | Size: 122 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 15 KiB |
|
@ -41,19 +41,19 @@ module.exports = React.createClass({
|
||||||
<div className="mx_BottomLeftMenu_options">
|
<div className="mx_BottomLeftMenu_options">
|
||||||
<div className="mx_RoomTile" onClick={this.onCreateRoomClick}>
|
<div className="mx_RoomTile" onClick={this.onCreateRoomClick}>
|
||||||
<div className="mx_RoomTile_avatar">
|
<div className="mx_RoomTile_avatar">
|
||||||
<img src="img/create-big.png" alt="Create new room" title="Create new room" width="42" height="42"/>
|
<img src="img/create-big.png" alt="Create new room" title="Create new room" width="36" height="36"/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_RoomTile_name">Create new room</div>
|
<div className="mx_RoomTile_name">Create new room</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_RoomTile" onClick={this.onRoomDirectoryClick}>
|
<div className="mx_RoomTile" onClick={this.onRoomDirectoryClick}>
|
||||||
<div className="mx_RoomTile_avatar">
|
<div className="mx_RoomTile_avatar">
|
||||||
<img src="img/directory-big.png" alt="Directory" title="Directory" width="42" height="42"/>
|
<img src="img/directory-big.png" alt="Directory" title="Directory" width="36" height="36"/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_RoomTile_name">Directory</div>
|
<div className="mx_RoomTile_name">Directory</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_RoomTile" onClick={this.onSettingsClick}>
|
<div className="mx_RoomTile" onClick={this.onSettingsClick}>
|
||||||
<div className="mx_RoomTile_avatar">
|
<div className="mx_RoomTile_avatar">
|
||||||
<img src="img/settings-big.png" alt="Settings" title="Settings" width="42" height="42"/>
|
<img src="img/settings-big.png" alt="Settings" title="Settings" width="36" height="36"/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_RoomTile_name">Settings</div>
|
<div className="mx_RoomTile_name">Settings</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -92,7 +92,7 @@ module.exports = React.createClass({
|
||||||
var roomAvatar = null;
|
var roomAvatar = null;
|
||||||
if (this.props.room) {
|
if (this.props.room) {
|
||||||
roomAvatar = (
|
roomAvatar = (
|
||||||
<RoomAvatar room={this.props.room} />
|
<RoomAvatar room={this.props.room} width="48" height="48" />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,19 @@ var sdk = require('matrix-react-sdk')
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'RoomTile',
|
displayName: 'RoomTile',
|
||||||
mixins: [RoomTileController],
|
mixins: [RoomTileController],
|
||||||
|
|
||||||
|
getInitialState: function() {
|
||||||
|
return( { hover : false });
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseEnter: function() {
|
||||||
|
this.setState( { hover : true });
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseLeave: function() {
|
||||||
|
this.setState( { hover : false });
|
||||||
|
},
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
var myUserId = MatrixClientPeg.get().credentials.userId;
|
var myUserId = MatrixClientPeg.get().credentials.userId;
|
||||||
var classes = classNames({
|
var classes = classNames({
|
||||||
|
@ -57,14 +70,26 @@ module.exports = React.createClass({
|
||||||
nameCell = <div className="mx_RoomTile_name">{name}</div>;
|
nameCell = <div className="mx_RoomTile_name">{name}</div>;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
var nameElement;
|
||||||
|
if (!this.props.collapsed) {
|
||||||
|
nameElement = <div className="mx_RoomTile_name">{name}</div>;
|
||||||
|
}
|
||||||
|
else if (this.state.hover) {
|
||||||
|
nameElement = <div className="mx_RoomTile_tooltip">
|
||||||
|
<img className="mx_RoomTile_chevron" src="img/chevron-left.png" width="9" height="16"/>
|
||||||
|
{ name }
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
|
|
||||||
var RoomAvatar = sdk.getComponent('atoms.RoomAvatar');
|
var RoomAvatar = sdk.getComponent('atoms.RoomAvatar');
|
||||||
return (
|
return (
|
||||||
<div className={classes} onClick={this.onClick}>
|
<div className={classes} onClick={this.onClick} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
|
||||||
<div className="mx_RoomTile_avatar">
|
<div className="mx_RoomTile_avatar">
|
||||||
<RoomAvatar room={this.props.room} />
|
<RoomAvatar room={this.props.room} />
|
||||||
{ badge }
|
{ badge }
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_RoomTile_name">{name}</div>
|
{ nameElement }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,16 +22,40 @@ var sdk = require('matrix-react-sdk')
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'LeftPanel',
|
displayName: 'LeftPanel',
|
||||||
|
|
||||||
|
getInitialState: function() {
|
||||||
|
return {
|
||||||
|
collapsed: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
onShowClick: function() {
|
||||||
|
this.setState({ collapsed : false });
|
||||||
|
},
|
||||||
|
|
||||||
|
onHideClick: function() {
|
||||||
|
this.setState({ collapsed : true });
|
||||||
|
},
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
var RoomList = sdk.getComponent('organisms.RoomList');
|
var RoomList = sdk.getComponent('organisms.RoomList');
|
||||||
var BottomLeftMenu = sdk.getComponent('molecules.BottomLeftMenu');
|
var BottomLeftMenu = sdk.getComponent('molecules.BottomLeftMenu');
|
||||||
var IncomingCallBox = sdk.getComponent('molecules.voip.IncomingCallBox');
|
var IncomingCallBox = sdk.getComponent('molecules.voip.IncomingCallBox');
|
||||||
|
|
||||||
|
var collapseButton;
|
||||||
|
var classes = "mx_LeftPanel";
|
||||||
|
if (this.state.collapsed) {
|
||||||
|
classes += " collapsed";
|
||||||
|
collapseButton = <img className="mx_LeftPanel_showButton" onClick={ this.onShowClick } src="img/menu.png" width="27" height="20" alt=">"/>
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
collapseButton = <img className="mx_LeftPanel_hideButton" onClick={ this.onHideClick } src="img/hide.png" width="12" height="20" alt="<"/>
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<aside className="mx_LeftPanel">
|
<aside className={classes}>
|
||||||
<img className="mx_LeftPanel_hideButton" src="img/hide.png" width="32" height="32" alt="<"/>
|
{ collapseButton }
|
||||||
<IncomingCallBox />
|
<IncomingCallBox />
|
||||||
<RoomList selectedRoom={this.props.selectedRoom} />
|
<RoomList selectedRoom={this.props.selectedRoom} collapsed={this.state.collapsed}/>
|
||||||
<BottomLeftMenu />
|
<BottomLeftMenu />
|
||||||
</aside>
|
</aside>
|
||||||
);
|
);
|
||||||
|
|
|
@ -34,13 +34,15 @@ module.exports = React.createClass({
|
||||||
callElement = <CallView className="mx_MatrixChat_callView"/>
|
callElement = <CallView className="mx_MatrixChat_callView"/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var recentsLabel = this.props.collapsed ? "" : "Recents";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mx_RoomList">
|
<div className="mx_RoomList">
|
||||||
{callElement}
|
{callElement}
|
||||||
<h2 className="mx_RoomList_favourites_label">Favourites</h2>
|
<h2 className="mx_RoomList_favourites_label">Favourites</h2>
|
||||||
<RoomDropTarget text="Drop here to favourite"/>
|
<RoomDropTarget text="Drop here to favourite"/>
|
||||||
|
|
||||||
<h2 className="mx_RoomList_recents_label">Recents</h2>
|
<h2 className="mx_RoomList_recents_label">{ recentsLabel } </h2>
|
||||||
<div className="mx_RoomList_recents">
|
<div className="mx_RoomList_recents">
|
||||||
{this.makeRoomTiles()}
|
{this.makeRoomTiles()}
|
||||||
</div>
|
</div>
|
||||||
|
|