psychobunny 12 years ago
commit 30323fa29f

@ -21,10 +21,18 @@
body {
background: #fdfdfd;
-webkit-transition: margin-bottom 250ms ease;
-moz-transition: margin-bottom 250ms ease;
-ms-transition: margin-bottom 250ms ease;
-o-transition: margin-bottom 250ms ease;
transition: margin-bottom 250ms ease;
&.composing {
margin-bottom: 350px;
}
}
// havent really decided what makes more sense tbh
.none, .hide {
.none {
display: none !important;
}
@ -73,6 +81,7 @@ footer.footer {
left: 0px;
bottom: 0px;
background: white;
z-index: 1500;
input {
width: 100%;
@ -374,27 +383,66 @@ footer.footer {
}
.category-purple {
background: #ab1290;
@color: #ab1290;
background: @color;
color: white;
&:hover {
background: lighten(@color, 10%);
}
}
.category-darkblue {
background: #004C66;
@color: #004C66;
background: @color;
color: white;
&:hover {
background: lighten(@color, 10%);
}
}
.category-blue {
background: #0059B2;
@color: #0059B2;
background: @color;
color: white;
&:hover {
background: lighten(@color, 10%);
}
}
.category-darkgreen {
background: #004000;
@color: #004000;
background: @color;
color: white;
&:hover {
background: lighten(@color, 10%);
}
}
.category-orange {
@color: #FF7A4D;
color: white;
background: #FF7A4D;
background: @color;
&:hover {
background: lighten(@color, 10%);
}
}
.category-list {
li {
.inline-block;
.pointer;
padding: 0.5em 0;
text-align: center;
margin: 0.5em;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
padding: 0.5em;
}
}
.hero-unit {

@ -100,9 +100,10 @@ var socket,
reply_title = reply_title || document.getElementById('reply_title');
post_content = post_content || document.getElementById('post_content');
post_window = post_window || document.getElementById('post_window');
jQuery(post_window).slideToggle(250);
jQuery(post_window).slideDown(250);
$(document.body).addClass('composing');
if (post_mode == 'topic') {
post_title.style.display = "block";
@ -149,7 +150,7 @@ var socket,
'topic_id' : topic_id,
'content' : content
});
jQuery(post_window).slideToggle(250);
jQuery(post_window).slideDown(250);
};
app.post_topic = function(category_id) {
@ -175,6 +176,7 @@ var socket,
jQuery('#post_title, #post_content').val('');
jQuery(post_window).slideToggle(250);
$(document.body).addClass('composing');
};

@ -10,7 +10,7 @@
<div class="account-username-box">
<span class="account-username"><a href="/users/{user.username}">{user.username}</a></span>
<span class="pull-right"><a href="/users/{user.username}/edit">edit</a></span>
<span id="editLink" class="pull-right"><a href="/users/{user.username}/edit">edit</a></span>
</div>
<div class="account-picture-block">
@ -22,6 +22,22 @@
<span>{user.email}</span>
<br/>
<span class="account-bio-label">full name</span>
<span>{user.fullname}</span>
<br/>
<span class="account-bio-label">website</span>
<span><a href="{user.website}">{user.website}</a></span>
<br/>
<span class="account-bio-label">location</span>
<span>{user.location}</span>
<br/>
<span class="account-bio-label">age</span>
<span>{user.age}</span>
<br/>
<span class="account-bio-label">member for</span>
<span>{user.joindate}</span>
<br/>
@ -34,13 +50,17 @@
<span id='postcount'>{user.postcount}</span>
</div>
<!-- END user -->
</div>
<script type="text/javascript">
var yourid = '{yourid}';
var theirid = '{theirid}';
(function() {
function addCommas(text) {
@ -54,6 +74,10 @@
var postcount = $('#postcount');
postcount.html(addCommas(postcount.html()));
var editLink = $('#editLink');
if( yourid !== theirid)
editLink.addClass('hidden');
});

@ -39,7 +39,7 @@
<div class="control-group">
<label class="control-label" for="inputWebsite">Website</label>
<div class="controls">
<input type="text" id="inputWebsite" placeholder="http://website.com" value="{user.fullname}">
<input type="text" id="inputWebsite" placeholder="http://website.com" value="{user.website}">
</div>
</div>
@ -57,9 +57,11 @@
</div>
</div>
<input type="hidden" id="inputUID" value="{user.uid}">
<div class="form-actions">
<button type="submit" class="btn btn-primary">Save changes</button>
<button type="button" class="btn">Cancel</button>
<a id="submitBtn" href="" class="btn btn-primary">Save changes</a>
<a href="/users/{user.username}" class="btn">Cancel</a>
</div>
</form>
@ -71,6 +73,28 @@
</div>
<script type="text/javascript">
(function() {
// ...
$(document).ready(function(){
$('#submitBtn').on('click',function(){
alert('click');
var userData = {
uid:$('#inputUID').val(),
email:$('#inputEmail').val(),
fullname:$('#inputFullname').val(),
website:$('#inputWebsite').val(),
birthday:$('#inputBirthday').val(),
location:$('#inputLocation').val()
};
$.post('/edituser',
userData,
function(data) {
alert('fail');
}
);
});
});
}());
</script>

@ -76,6 +76,15 @@
right_menu.appendChild(loginEl);
}
});
// Post window events
var postWindowEl = document.getElementById('post_window'),
discardEl = document.getElementById('discard-post');
discardEl.addEventListener('click', function() {
$(postWindowEl).slideToggle(250);
$(document.body).removeClass('composing');
}, false);
}());
</script>
<!-- END Forum Info -->

@ -64,7 +64,7 @@
</div>
<div class="btn-group" style="float: right; margin-right: -12px">
<span id="submit_post_btn" class="btn" onclick="app.post_topic()"><i class="icon-ok"></i> Submit</span>
<span class="btn" onclick="jQuery(post_window).slideToggle(250);"><i class="icon-remove"></i> Discard</span>
<span class="btn" id="discard-post"><i class="icon-remove"></i> Discard</span>
</div>
</div>

@ -43,9 +43,29 @@
<li><a href="#" id="pin_thread"><i class="icon-pushpin"></i> Pin Thread</a></li>
<li><a href="#" id="lock_thread"><i class="icon-lock"></i> Lock Thread</a></li>
<li class="divider"></li>
<li><a href="#" id="delete_thread"><span class="text-error"><i class="icon-trash"></i> Delete Thread</span></a></li>
<li><a href="#" id="move_thread"><i class="icon-move"></i> Move Thread</a></li>
<li class="divider"></li>
<li><a href="#" id="delete_thread"><span class="text-error"><i class="icon-trash"></i> Delete Thread</span></a></li>
</ul>
</div>
<div id="move_thread_modal" class="modal hide fade">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h3>Move Thread</h3>
</div>
<div class="modal-body">
<p id="categories-loading"><i class="icon-spin icon-refresh"></i> Loading Categories</p>
<ul class="category-list"></ul>
<div id="move-confirm" style="display: none;">
<hr />
<div class="alert">This topic will be moved to the category <strong><span id="confirm-category-name"></span></strong></div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn" data-dismiss="modal" id="move_thread_cancel">Close</a>
<button type="button" class="btn btn-primary" id="move_thread_commit" disabled>Move</a>
</div>
</div>
<script type="text/javascript">
@ -72,7 +92,9 @@
if (expose_tools === '1') {
var deleteThreadEl = document.getElementById('delete_thread'),
lockThreadEl = document.getElementById('lock_thread'),
pinThreadEl = document.getElementById('pin_thread');
pinThreadEl = document.getElementById('pin_thread'),
moveThreadEl = document.getElementById('move_thread'),
moveThreadModal = $('#move_thread_modal');
adminTools.style.visibility = 'inherit';
@ -88,7 +110,7 @@
socket.emit('api:topic.restore', { tid: tid });
}
}
});
}, false);
lockThreadEl.addEventListener('click', function(e) {
e.preventDefault();
@ -97,7 +119,7 @@
} else {
socket.emit('api:topic.unlock', { tid: tid });
}
});
}, false);
pinThreadEl.addEventListener('click', function(e) {
e.preventDefault();
@ -106,6 +128,82 @@
} else {
socket.emit('api:topic.unpin', { tid: tid });
}
}, false);
moveThreadEl.addEventListener('click', function(e) {
e.preventDefault();
moveThreadModal.modal('show');
}, false);
moveThreadModal.on('shown', function() {
var loadingEl = document.getElementById('categories-loading');
if (loadingEl) {
socket.once('api:categories.get', function(data) {
// Render categories
var categoriesFrag = document.createDocumentFragment(),
categoryEl = document.createElement('li'),
numCategories = data.categories.length,
modalBody = moveThreadModal.find('.modal-body'),
categoriesEl = modalBody[0].getElementsByTagName('ul')[0],
confirmDiv = document.getElementById('move-confirm'),
confirmCat = confirmDiv.getElementsByTagName('span')[0],
commitEl = document.getElementById('move_thread_commit'),
cancelEl = document.getElementById('move_thread_cancel'),
x, info, targetCid, targetCatLabel;
categoriesEl.className = 'category-list';
for(x=0;x<numCategories;x++) {
info = data.categories[x];
categoryEl.className = info.blockclass;
categoryEl.innerHTML = '<i class="' + info.icon + '"></i> ' + info.name;
categoryEl.setAttribute('data-cid', info.cid);
categoriesFrag.appendChild(categoryEl.cloneNode(true));
}
categoriesEl.appendChild(categoriesFrag);
modalBody[0].removeChild(loadingEl);
categoriesEl.addEventListener('click', function(e) {
if (e.target.nodeName === 'LI') {
confirmCat.innerHTML = e.target.innerHTML;
confirmDiv.style.display = 'block';
targetCid = e.target.getAttribute('data-cid');
targetCatLabel = e.target.innerHTML;
commitEl.disabled = false;
}
}, false);
commitEl.addEventListener('click', function() {
if (!commitEl.disabled && targetCid) {
commitEl.disabled = true;
$(cancelEl).fadeOut(250);
$(moveThreadModal).find('.modal-header button').fadeOut(250);
commitEl.innerHTML = 'Moving <i class="icon-spin icon-refresh"></i>';
socket.once('api:topic.move', function(data) {
moveThreadModal.modal('hide');
if (data.status === 'ok') {
app.alert({
'alert_id': 'thread_move',
type: 'success',
title: 'Topic Successfully Moved',
message: 'This topic has been successfully moved to ' + targetCatLabel,
timeout: 5000
});
} else {
app.alert({
'alert_id': 'thread_move',
type: 'error',
title: 'Unable to Move Topic',
message: 'This topic could not be moved to ' + targetCatLabel + '.<br />Please try again later',
timeout: 5000
});
}
});
socket.emit('api:topic.move', { tid: tid, cid: targetCid });
}
});
});
socket.emit('api:categories.get');
}
});
}
});
@ -187,6 +285,10 @@
}
});
socket.on('event:topic_moved', function(data) {
if (data && data.tid > 0) ajaxify.go('topic/' + data.tid);
});
function adjust_rep(value, pid, uid) {
var post_rep = jQuery('.post_rep_' + pid),
user_rep = jQuery('.user_rep_' + uid);

@ -34,7 +34,7 @@ var RDB = require('./redis.js'),
'user_rep' : user_data[uid].reputation || 0,
'gravatar' : user_data[uid].picture,
'fav_star_class' : vote_data[pid] ? 'icon-star' : 'icon-star-empty',
'display_moderator_tools' : uid == current_user ? 'show' : 'hide'
'display_moderator_tools' : uid == current_user ? 'show' : 'none'
});
}

@ -20,7 +20,7 @@ var RDB = require('./redis.js'),
//build a proper wrapper for this and move it into above function later
var range_var = (category_id) ? 'categories:' + category_id + ':tid' : 'topics:tid';
RDB.lrange(range_var, start, end, function(tids) {
RDB.db.smembers(range_var, function(err, tids) {
var title = [],
uid = [],
timestamp = [],
@ -83,10 +83,10 @@ var RDB = require('./redis.js'),
'relativeTime': utils.relativeTime(timestamp[i]),
'slug' : slug[i],
'post_count' : postcount[i],
'lock-icon': locked[i] === '1' ? 'icon-lock' : 'hide',
'lock-icon': locked[i] === '1' ? 'icon-lock' : 'none',
'deleted': deleted[i],
'pinned': parseInt(pinned[i] || 0), // For sorting purposes
'pin-icon': pinned[i] === '1' ? 'icon-pushpin' : 'hide'
'pin-icon': pinned[i] === '1' ? 'icon-pushpin' : 'none'
});
}
@ -116,7 +116,6 @@ var RDB = require('./redis.js'),
});
//} else callback({'category_id': category_id, 'topics': []});
});
}
@ -146,12 +145,6 @@ var RDB = require('./redis.js'),
// need to add some unique key sent by client so we can update this with the real uid later
RDB.lpush('topics:queued:tid', tid);
}
if (category_id) {
RDB.lpush('categories:' + category_id + ':tid', tid);
}
var slug = tid + '/' + utils.slugify(title);
@ -182,6 +175,8 @@ var RDB = require('./redis.js'),
// in future it may be possible to add topics to several categories, so leaving the door open here.
RDB.db.sadd('categories:' + category_id + ':tid', tid);
RDB.set('tid:' + tid + ':cid', category_id);
categories.get_category([category_id], function(data) {
RDB.set('tid:' + tid + ':category_name', data.categories[0].name);
RDB.set('tid:' + tid + ':category_slug', data.categories[0].slug);
@ -287,4 +282,22 @@ var RDB = require('./redis.js'),
}
});
}
Topics.move = function(tid, cid, socket) {
RDB.get('tid:' + tid + ':cid', function(oldCid) {
RDB.db.smove('categories:' + oldCid + ':tid', 'categories:' + cid + ':tid', tid, function(err, result) {
if (!err && result === 1) {
RDB.set('tid:' + tid + ':cid', cid);
categories.get_category([cid], function(data) {
RDB.set('tid:' + tid + ':category_name', data.categories[0].name);
RDB.set('tid:' + tid + ':category_slug', data.categories[0].slug);
});
socket.emit('api:topic.move', { status: 'ok' });
io.sockets.in('topic_' + tid).emit('event:topic_moved', { tid: tid });
} else {
socket.emit('api:topic.move', { status: 'error' });
}
});
});
}
}(exports));

@ -69,6 +69,13 @@ var config = require('../config.js'),
});
}
User.updateUserFields = function(uid, data) {
for(var key in data) {
User.setUserField(uid, key, data[key]);
}
}
User.setUserField = function(uid, field, value) {
RDB.db.hset('user:'+uid, field, value);
}

@ -232,7 +232,7 @@ passport.deserializeUser(function(uid, done) {
else if (String(req.params.section).toLowerCase() === 'edit') {
get_account_fn(req, res, function(userData) {
res.send(JSON.stringify(userData));
});
});
} else {
get_account_fn(req, res, function(userData) {
res.send(JSON.stringify(userData));
@ -336,6 +336,20 @@ passport.deserializeUser(function(uid, done) {
});
});
app.post('/edituser', function(req, res){
if(!req.user)
return res.redirect('/403');
if(req.user.uid != req.body.uid)
return res.redirect('/');
user.updateUserFields(req.user.uid, req.body);
res.redirect('/');
});
app.get('/baristest', function(req, res) {
/*user.getUserField(req.user.uid, 'email', function(data) {
console.log(" I GOT FIELD " +data);
@ -366,8 +380,14 @@ passport.deserializeUser(function(uid, done) {
if(data)
{
data.joindate = utils.relativeTime(data.joindate);
data.age = new Date().getFullYear() - new Date(data.birthday).getFullYear();;
data.uid = uid;
callback({user:data});
callback({
yourid: (req.user)?req.user.uid : 0,
theirid: uid,
user: data
});
}
else
callback({user:{}});
@ -409,10 +429,16 @@ passport.deserializeUser(function(uid, done) {
app.get('/users/:uid/edit', function(req, res){
if(req.user && req.params.uid)
res.send(templates['header'] + create_route('users/'+req.params.uid+'/edit','accountedit') + templates['footer']);
else
return res.redirect('/403');
if(!req.user)
return res.redirect('/403');
user.getUserField(req.user.uid, 'username', function(username) {
if(req.params.uid && username === req.params.uid)
res.send(templates['header'] + create_route('users/'+req.params.uid+'/edit','accountedit') + templates['footer']);
else
return res.redirect('/403');
});
});

@ -203,6 +203,16 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
socket.on('api:topic.unpin', function(data) {
modules.topics.unpin(data.tid, uid, socket);
});
socket.on('api:categories.get', function() {
modules.categories.get(function(categories) {
socket.emit('api:categories.get', categories);
});
});
socket.on('api:topic.move', function(data) {
modules.topics.move(data.tid, data.cid, socket);
});
});
}(SocketIO));

Loading…
Cancel
Save