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  | 
							
								
								
									
										
											BIN
										
									
								
								src/skins/vector/img/menu.png
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						| 
		 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>
 | 
				
			||||||
 | 
				
			|||||||