trac670 trac689 Favorites (duplicate id, background image, JavaScript)

darcs-hash:20081115033549-eefa4-cfbca6f9c723aa63869c39d6851de7a7803f0703.gz
This commit is contained in:
csarven 2008-11-14 22:35:49 -05:00
parent 6a02f5d3c2
commit 322a79739d
11 changed files with 220 additions and 174 deletions

View File

@ -37,17 +37,17 @@ class DisfavorAction extends Action {
return; return;
} }
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
$this->client_error(_('There was a problem with your session token. Try again, please.'));
return;
}
$id = $this->trimmed('notice'); $id = $this->trimmed('notice');
$notice = Notice::staticGet($id); $notice = Notice::staticGet($id);
$token = $this->trimmed('token-'.$notice->id);
if (!$token || $token != common_session_token()) {
$this->client_error(_("There was a problem with your session token. Try again, please."));
return;
}
$fave = new Fave(); $fave = new Fave();
$fave->user_id = $this->id; $fave->user_id = $this->id;
$fave->notice_id = $notice->id; $fave->notice_id = $notice->id;
@ -69,7 +69,7 @@ class DisfavorAction extends Action {
if ($this->boolean('ajax')) { if ($this->boolean('ajax')) {
common_start_html('text/xml'); common_start_html('text/xml');
common_element_start('head'); common_element_start('head');
common_element('title', _('Favor')); common_element('title', null, _('Add to favorites'));
common_element_end('head'); common_element_end('head');
common_element_start('body'); common_element_start('body');
common_favor_form($notice); common_favor_form($notice);

View File

@ -38,17 +38,18 @@ class FavorAction extends Action {
return; return;
} }
# CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
$this->client_error(_('There was a problem with your session token. Try again, please.'));
return;
}
$id = $this->trimmed('notice'); $id = $this->trimmed('notice');
$notice = Notice::staticGet($id); $notice = Notice::staticGet($id);
# CSRF protection
$token = $this->trimmed('token-'.$notice->id);
if (!$token || $token != common_session_token()) {
$this->client_error(_("There was a problem with your session token. Try again, please."));
return;
}
if ($user->hasFave($notice)) { if ($user->hasFave($notice)) {
$this->client_error(_('This notice is already a favorite!')); $this->client_error(_('This notice is already a favorite!'));
return; return;
@ -67,7 +68,7 @@ class FavorAction extends Action {
if ($this->boolean('ajax')) { if ($this->boolean('ajax')) {
common_start_html('text/xml'); common_start_html('text/xml');
common_element_start('head'); common_element_start('head');
common_element('title', _('Disfavor')); common_element('title', null, _('Disfavor favorite'));
common_element_end('head'); common_element_end('head');
common_element_start('body'); common_element_start('body');
common_disfavor_form($notice); common_disfavor_form($notice);

View File

@ -17,94 +17,86 @@
*/ */
$(document).ready(function(){ $(document).ready(function(){
// count character on keyup // count character on keyup
function counter(event){ function counter(event){
var maxLength = 140; var maxLength = 140;
var currentLength = $("#status_textarea").val().length; var currentLength = $("#status_textarea").val().length;
var remaining = maxLength - currentLength; var remaining = maxLength - currentLength;
var counter = $("#counter"); var counter = $("#counter");
counter.text(remaining); counter.text(remaining);
if (remaining <= 0) {
counter.addClass("toomuch");
} else {
counter.removeClass("toomuch");
}
}
if (remaining <= 0) { function submitonreturn(event) {
counter.attr("class", "toomuch"); if (event.keyCode == 13) {
} else { $("#status_form").submit();
counter.attr("class", ""); event.preventDefault();
} event.stopPropagation();
} return false;
}
return true;
}
function submitonreturn(event) { if ($("#status_textarea").length) {
if (event.keyCode == 13) { $("#status_textarea").bind("keyup", counter);
$("#status_form").submit(); $("#status_textarea").bind("keydown", submitonreturn);
event.preventDefault();
event.stopPropagation(); // run once in case there's something in there
return false; counter();
}
return true; // set the focus
} $("#status_textarea").focus();
}
if ($("#status_textarea").length) { // XXX: refactor this code
$("#status_textarea").bind("keyup", counter);
$("#status_textarea").bind("keydown", submitonreturn);
// run once in case there's something in there var favoptions = { dataType: 'xml',
counter(); success: function(xml) { var new_form = document._importNode($('form', xml).get(0), true);
var dis = new_form.id;
var fav = dis.replace('disfavor', 'favor');
$('form#'+fav).replaceWith(new_form);
$('form#'+dis).ajaxForm(disoptions).each(addAjaxHidden);
}
};
// set the focus var disoptions = { dataType: 'xml',
$("#status_textarea").focus(); success: function(xml) { var new_form = document._importNode($('form', xml).get(0), true);
} var fav = new_form.id;
var dis = fav.replace('favor', 'disfavor');
$('form#'+dis).replaceWith(new_form);
$('form#'+fav).ajaxForm(favoptions).each(addAjaxHidden);
}
};
// XXX: refactor this code function addAjaxHidden() {
var ajax = document.createElement('input');
ajax.setAttribute('type', 'hidden');
ajax.setAttribute('name', 'ajax');
ajax.setAttribute('value', 1);
this.appendChild(ajax);
}
var favoptions = {dataType: 'xml', $("form.favor").ajaxForm(favoptions);
success: function(xml) { $("form.disfavor").ajaxForm(disoptions);
var new_form = $('form.disfavor', xml).get(0); $("form.favor").each(addAjaxHidden);
var dis = new_form.id; $("form.disfavor").each(addAjaxHidden);
var fav = dis.replace('disfavor', 'favor');
if (document.importNode) {
new_form = document.importNode(new_form, true);
}
$('form#'+fav).replaceWith(new_form);
$('form#'+dis).ajaxForm(disoptions).each(addAjaxHidden);
}};
var disoptions = {dataType: 'xml',
success: function(xml) {
var new_form = $('form.favor', xml).get(0);
var fav = new_form.id;
var dis = fav.replace('favor', 'disfavor');
if (document.importNode) {
new_form = document.importNode(new_form, true);
}
$('form#'+dis).replaceWith(new_form);
$('form#'+fav).ajaxForm(favoptions).each(addAjaxHidden); ;
}};
function addAjaxHidden() {
var ajax = document.createElement('input');
ajax.setAttribute('type', 'hidden');
ajax.setAttribute('name', 'ajax');
ajax.setAttribute('value', 1);
this.appendChild(ajax);
}
$("form.favor").ajaxForm(favoptions);
$("form.disfavor").ajaxForm(disoptions);
$("form.favor").each(addAjaxHidden);
$("form.disfavor").each(addAjaxHidden);
}); });
function doreply(nick,id) { function doreply(nick,id) {
rgx_username = /^[0-9a-zA-Z\-_.]*$/; rgx_username = /^[0-9a-zA-Z\-_.]*$/;
if (nick.match(rgx_username)) { if (nick.match(rgx_username)) {
replyto = "@" + nick + " "; replyto = "@" + nick + " ";
if ($("#status_textarea").length) { if ($("#status_textarea").length) {
$("#status_textarea").val(replyto); $("#status_textarea").val(replyto);
$("form#status_form input#inreplyto").val(id); $("form#status_form input#inreplyto").val(id);
$("#status_textarea").focus(); $("#status_textarea").focus();
return false; return false;
} }
} }
return true; return true;
} }

46
js/xbImportNode.js Normal file
View File

@ -0,0 +1,46 @@
/* is this stuff defined? */
if (!document.ELEMENT_NODE) {
document.ELEMENT_NODE = 1;
document.ATTRIBUTE_NODE = 2;
document.TEXT_NODE = 3;
document.CDATA_SECTION_NODE = 4;
document.ENTITY_REFERENCE_NODE = 5;
document.ENTITY_NODE = 6;
document.PROCESSING_INSTRUCTION_NODE = 7;
document.COMMENT_NODE = 8;
document.DOCUMENT_NODE = 9;
document.DOCUMENT_TYPE_NODE = 10;
document.DOCUMENT_FRAGMENT_NODE = 11;
document.NOTATION_NODE = 12;
}
document._importNode = function(node, allChildren) {
/* find the node type to import */
switch (node.nodeType) {
case document.ELEMENT_NODE:
/* create a new element */
var newNode = document.createElement(node.nodeName);
/* does the node have any attributes to add? */
if (node.attributes && node.attributes.length > 0)
/* add all of the attributes */
for (var i = 0, il = node.attributes.length; i < il;) {
if (node.attributes[i].nodeName == 'class') {
newNode.className = node.getAttribute(node.attributes[i++].nodeName);
} else {
newNode.setAttribute(node.attributes[i].nodeName, node.getAttribute(node.attributes[i++].nodeName));
}
}
/* are we going after children too, and does the node have any? */
if (allChildren && node.childNodes && node.childNodes.length > 0)
/* recursively get all of the child nodes */
for (var i = 0, il = node.childNodes.length; i < il;)
newNode.appendChild(document._importNode(node.childNodes[i++], allChildren));
return newNode;
break;
case document.TEXT_NODE:
case document.CDATA_SECTION_NODE:
case document.COMMENT_NODE:
return document.createTextNode(node.nodeValue);
break;
}
};

View File

@ -180,6 +180,9 @@ function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=
common_element('script', array('type' => 'text/javascript', common_element('script', array('type' => 'text/javascript',
'src' => common_path('js/jquery.form.js')), 'src' => common_path('js/jquery.form.js')),
' '); ' ');
common_element('script', array('type' => 'text/javascript',
'src' => common_path('js/xbImportNode.js')),
' ');
common_element('script', array('type' => 'text/javascript', common_element('script', array('type' => 'text/javascript',
'src' => common_path('js/util.js?version='.LACONICA_VERSION)), 'src' => common_path('js/util.js?version='.LACONICA_VERSION)),
' '); ' ');
@ -1809,13 +1812,25 @@ function common_disfavor_form($notice) {
'method' => 'post', 'method' => 'post',
'class' => 'disfavor', 'class' => 'disfavor',
'action' => common_local_url('disfavor'))); 'action' => common_local_url('disfavor')));
common_hidden('token', common_session_token());
common_hidden('notice', $notice->id); common_element('input', array('type' => 'hidden',
'name' => 'token-'. $notice->id,
'id' => 'token-'. $notice->id,
'class' => 'token',
'value' => common_session_token()));
common_element('input', array('type' => 'hidden',
'name' => 'notice',
'id' => 'notice-n'. $notice->id,
'class' => 'notice',
'value' => $notice->id));
common_element('input', array('type' => 'submit', common_element('input', array('type' => 'submit',
'id' => 'disfavor-submit-' . $notice->id, 'id' => 'disfavor-submit-' . $notice->id,
'name' => 'disfavor-submit-' . $notice->id, 'name' => 'disfavor-submit-' . $notice->id,
'class' => 'disfavor', 'class' => 'disfavor',
'value' => '♥')); 'value' => 'Disfavor favorite',
'title' => 'Remove this message from favorites'));
common_element_end('form'); common_element_end('form');
} }
@ -1824,13 +1839,25 @@ function common_favor_form($notice) {
'method' => 'post', 'method' => 'post',
'class' => 'favor', 'class' => 'favor',
'action' => common_local_url('favor'))); 'action' => common_local_url('favor')));
common_hidden('token', common_session_token());
common_hidden('notice', $notice->id); common_element('input', array('type' => 'hidden',
'name' => 'token-'. $notice->id,
'id' => 'token-'. $notice->id,
'class' => 'token',
'value' => common_session_token()));
common_element('input', array('type' => 'hidden',
'name' => 'notice',
'id' => 'notice-n'. $notice->id,
'class' => 'notice',
'value' => $notice->id));
common_element('input', array('type' => 'submit', common_element('input', array('type' => 'submit',
'id' => 'favor-submit-' . $notice->id, 'id' => 'favor-submit-' . $notice->id,
'name' => 'favor-submit-' . $notice->id, 'name' => 'favor-submit-' . $notice->id,
'class' => 'favor', 'class' => 'favor',
'value' => '♡')); 'value' => 'Add to favorites',
'title' => 'Add this message to favorites'));
common_element_end('form'); common_element_end('form');
} }

View File

@ -179,6 +179,36 @@ padding-top:2px;
padding-left:30px; padding-left:30px;
} }
form#disfavor, form.disfavor,
form#favor, form.favor {
float: right;
}
/*favorites*/
input#favor, input.favor,
input#disfavor, input.disfavor {
background-color:#fcfff5;
background-image:url(icon_heart-01.png);
background-repeat:no-repeat;
cursor: pointer;
border: 0;
width: 16px;
height:16px;
text-indent:-9999px;
}
input#disfavor, input.disfavor {
background-image:url(icon_heart-02.png);
}
.notice_single:hover input.favor,
.notice_single:hover input.disfavor {
background-color:#f3f8ea;
}
/* ----- Nav Footer ----- */ /* ----- Nav Footer ----- */
#nav_sub { #nav_sub {
clear: both; clear: both;
@ -686,44 +716,9 @@ input#openid_url {
line-height: 15px; line-height: 15px;
} }
/* ----- favor/disfavor -----*/
form#disfavor, form.disfavor {
display: inline;
float: right;
}
input#disfavor, input.disfavor {
display: inline;
color: #C15D42;
background-color: #FBF2D7;
cursor: pointer;
border: 0;
width: auto;
}
form#favor, form.favor {
display: inline;
float: right;
}
input#favor, input.favor {
display: inline;
color: #C15D42;
background-color: #FBF2D7;
cursor: pointer;
border: 0;
width: auto;
}
input.favor:hover {
background-color: #f7ebcc;
}
input.disfavor:hover {
background-color: #f7ebcc;
}
/* ----- direct message ----- */ /* ----- direct message ----- */
#message_form { #message_form {
@ -811,8 +806,8 @@ p.tagcloud a.smallest {
font-size: 60%; font-size: 60%;
} }
/* ----- Mailbox ----- */
/* ----- Mailbox ----- */
#messages { #messages {
clear: both; clear: both;
margin: 0 auto; margin: 0 auto;
@ -844,4 +839,4 @@ font-size: 60%;
display: inline; display: inline;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

View File

@ -1,6 +1,14 @@
@charset "UTF-8"; @charset "UTF-8";
/* CSS Document */ /* CSS Document */
input.disfavor,
input.favor {
text-indent:0;
text-align:right;
padding-left:25px;
}
#statistics dd { #statistics dd {
clear: both; clear: both;
} }
@ -17,4 +25,4 @@ img.avatar.original, img.avatar.profile {
#nav_pagination li a { #nav_pagination li a {
padding: 6px 15px; padding: 6px 15px;
line-height: 27px; line-height: 27px;
} }

View File

@ -57,6 +57,7 @@ a {
border-top: 1px solid #D8E2D7; border-top: 1px solid #D8E2D7;
} }
.instructions p, .success, .error { .instructions p, .success, .error {
border: 1px solid #91AA9D; border: 1px solid #91AA9D;
color: #FCFFF5; color: #FCFFF5;
@ -174,21 +175,6 @@ textarea:focus, input:focus {
background-color: #F3F8EA; background-color: #F3F8EA;
} }
input#disfavor, input.disfavor {
background-color: white;
}
input#favor, input.favor {
background-color: white;
}
input.favor:hover {
background-color: #F3F8EA;
}
input.disfavor:hover {
background-color: #F3F8EA;
}
#messages { #messages {
border-top: 1px solid #D8E2D7; border-top: 1px solid #D8E2D7;
@ -200,21 +186,4 @@ input.disfavor:hover {
.message_single:hover { .message_single:hover {
background-color: #F3F8EA; background-color: #F3F8EA;
} }

View File

@ -4,3 +4,11 @@
#wrap { #wrap {
background: url(bg-header.gif) repeat-x #FCFFF5; background: url(bg-header.gif) repeat-x #FCFFF5;
} }
input.disfavor,
input.favor {
text-indent:0px;
text-align:right;
padding-left:25px;
}