Merge pull request #20 from duthied/master

Notifications page improvements + testbubble theme tweaks
This commit is contained in:
duthied 2011-10-06 23:29:44 -07:00
commit 72af2d610b
12 changed files with 320 additions and 124 deletions

View file

@ -114,7 +114,7 @@ function nav(&$a) {
/* only show friend requests for normal pages. Other page types have automatic friendship. */ /* only show friend requests for normal pages. Other page types have automatic friendship. */
if($_SESSION['page_flags'] == PAGE_NORMAL) { if($_SESSION['page_flags'] == PAGE_NORMAL) {
$nav['notifications'] = array('notifications', t('Notifications'), "", t('Friend requests')); $nav['notifications'] = array('notifications/network', t('Notifications'), "", t('Notifications'));
} }
$nav['messages'] = array('message', t('Messages'), "", t('Private mail')); $nav['messages'] = array('message', t('Messages'), "", t('Private mail'));

View file

@ -95,22 +95,15 @@
if(home == 0) { home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') } if(home == 0) { home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
$('#home-update').html(home); $('#home-update').html(home);
var intro = $(data).find('intro').text();
if(intro == 0) { intro = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
$('#intro-update').html(intro);
var mail = $(data).find('mail').text();
if(mail == 0) { mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
$('#mail-update').html(mail);
var eNotif = $(data).find('notif') var eNotif = $(data).find('notif')
notif = eNotif.attr('count'); notif = eNotif.attr('count');
if (notif>0){ if (notif>0){
$("#nav-notifications-linkmenu").addClass("on"); $("#nav-notifications-linkmenu").addClass("on");
nnm = $("#nav-notifications-menu"); nnm = $("#nav-notifications-menu");
nnm.html("");
//nnm.html("");
nnm.html("<li><a href='/notifications/network'>Show All Notifications</a></li>");
//nnm.attr('popup','true'); //nnm.attr('popup','true');
eNotif.children("note").each(function(){ eNotif.children("note").each(function(){
e = $(this); e = $(this);
@ -118,6 +111,7 @@
html = notifications_tpl.format(e.attr('href'),e.attr('photo'), text, e.attr('date')); html = notifications_tpl.format(e.attr('href'),e.attr('photo'), text, e.attr('date'));
nnm.append(html); nnm.append(html);
}); });
} else { } else {
$("#nav-notifications-linkmenu").removeClass("on"); $("#nav-notifications-linkmenu").removeClass("on");
$("#nav-notifications-menu").html(notifications_empty); $("#nav-notifications-menu").html(notifications_empty);
@ -164,15 +158,6 @@
}); });
function NavUpdate() { function NavUpdate() {
if(! stopped) {
$.get("ping",function(data) {
$(data).find('result').each(function() {
// send nav-update event
$('nav').trigger('nav-update', this);
});
}) ;
}
if($('#live-network').length) { src = 'network'; liveUpdate(); } if($('#live-network').length) { src = 'network'; liveUpdate(); }
if($('#live-profile').length) { src = 'profile'; liveUpdate(); } if($('#live-profile').length) { src = 'profile'; liveUpdate(); }
@ -191,6 +176,14 @@
} }
} }
if(! stopped) {
$.get("ping",function(data) {
$(data).find('result').each(function() {
// send nav-update event
$('nav').trigger('nav-update', this);
});
}) ;
}
timer = setTimeout(NavUpdate,30000); timer = setTimeout(NavUpdate,30000);
} }

View file

@ -64,20 +64,19 @@ function notifications_content(&$a) {
} }
$o = ''; $o = '';
nav_set_selected("notifications");
if(($a->argc > 1) && ($a->argv[1] == 'all')) if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) {
if(($a->argc > 2) && ($a->argv[2] == 'all'))
$sql_extra = ''; $sql_extra = '';
else else
$sql_extra = " AND `ignore` = 0 "; $sql_extra = " AND `ignore` = 0 ";
$o .= '<h1>' . t('Pending Friend/Connect Notifications') . '</h1>' . "\r\n"; $notif_tpl = get_markup_template('notifications.tpl');
$o .= '<div id="notification-show-hide-wrapper" >'; $notif_content .= '<a href="' . ((strlen($sql_extra)) ? 'notifications/intros/all' : 'notifications/intros' ) . '" id="notifications-show-hide-link" >'
$o .= '<a href="' . ((strlen($sql_extra)) ? 'notifications/all' : 'notifications' ) . '" id="notifications-show-hide-link" >'
. ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '</a></div>' . "\r\n"; . ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '</a></div>' . "\r\n";
$r = q("SELECT COUNT(*) AS `total` FROM `intro` $r = q("SELECT COUNT(*) AS `total` FROM `intro`
WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ",
intval($_SESSION['uid']) intval($_SESSION['uid'])
@ -101,7 +100,7 @@ function notifications_content(&$a) {
if($rr['fid']) { if($rr['fid']) {
$return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
$o .= replace_macros($sugg,array( $notif_content .= replace_macros($sugg,array(
'$str_notifytype' => t('Notification type: '), '$str_notifytype' => t('Notification type: '),
'$notify_type' => t('Friend Suggestion'), '$notify_type' => t('Friend Suggestion'),
'$intro_id' => $rr['intro_id'], '$intro_id' => $rr['intro_id'],
@ -144,9 +143,7 @@ function notifications_content(&$a) {
)); ));
} }
$notif_content .= replace_macros($tpl,array(
$o .= replace_macros($tpl,array(
'$str_notifytype' => t('Notification type: '), '$str_notifytype' => t('Notification type: '),
'$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')), '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
'$dfrn_text' => $dfrn_text, '$dfrn_text' => $dfrn_text,
@ -169,6 +166,156 @@ function notifications_content(&$a) {
else else
info( t('No notifications.') . EOL); info( t('No notifications.') . EOL);
$o .= replace_macros($notif_tpl,array(
'$notif_content' => $notif_content,
'$activetab' => 'intros'
));
$o .= paginate($a);
return $o;
} else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
$notif_tpl = get_markup_template('notifications.tpl');
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
`item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`,
`pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
intval(local_user())
);
$tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
$tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
$tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
$tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
$notif_content = '';
if (count($r) > 0) {
foreach ($r as $it) {
switch($it['verb']){
case ACTIVITY_LIKE:
$notif_content .= replace_macros($tpl_item_likes,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
'$item_when' => relative_date($it['created'])
));
break;
case ACTIVITY_DISLIKE:
$notif_content .= replace_macros($tpl_item_dislikes,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
'$item_when' => relative_date($it['created'])
));
break;
case ACTIVITY_FRIEND:
$notif_content .= replace_macros($tpl_item_friends,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s is now friend with %s"), $it['author-name'], $it['fname']),
'$item_when' => relative_date($it['created'])
));
break;
default:
$notif_content .= replace_macros($tpl_item_comments,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s commented %s's post"), $it['author-name'], $it['pname']),
'$item_when' => relative_date($it['created'])
));
}
}
} else {
$notif_content = 'Nothing new!';
}
$o .= replace_macros($notif_tpl,array(
'$notif_content' => $notif_content,
'$activetab' => 'network'
));
} else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
$notif_tpl = get_markup_template('notifications.tpl');
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
`item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`,
`pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1 ORDER BY `item`.`created` DESC",
intval(local_user())
);
$tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
$tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
$tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
$tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
$notif_content = '';
if (count($r) > 0) {
foreach ($r as $it) {
switch($it['verb']){
case ACTIVITY_LIKE:
$notif_content .= replace_macros($tpl_item_likes,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
'$item_when' => relative_date($it['created'])
));
break;
case ACTIVITY_DISLIKE:
$notif_content .= replace_macros($tpl_item_dislikes,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
'$item_when' => relative_date($it['created'])
));
break;
case ACTIVITY_FRIEND:
$notif_content .= replace_macros($tpl_item_friends,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s is now friend with %s"), $it['author-name'], $it['fname']),
'$item_when' => relative_date($it['created'])
));
break;
default:
$notif_content .= replace_macros($tpl_item_comments,array(
'$item_link' => $a->get_baseurl().'/display/'.$a->user['nickname']."/".$it['parent'],
'$item_image' => $it['author-avatar'],
'$item_text' => sprintf( t("%s commented %s's post"), $it['author-name'], $it['pname']),
'$item_when' => relative_date($it['created'])
));
}
}
} else {
$notif_content = 'Nothing new!';
}
$o .= replace_macros($notif_tpl,array(
'$notif_content' => $notif_content,
'$activetab' => 'home'
));
}
$o .= paginate($a); $o .= paginate($a);
return $o; return $o;
} }

View file

@ -43,6 +43,7 @@
<li id="nav-notifications-linkmenu" class="nav-menu-icon"><a href="$nav.notifications.0" rel="#nav-notifications-menu" title="$nav.notifications.1"><span class="icon s22 notify">$nav.notifications.1</span></a> <li id="nav-notifications-linkmenu" class="nav-menu-icon"><a href="$nav.notifications.0" rel="#nav-notifications-menu" title="$nav.notifications.1"><span class="icon s22 notify">$nav.notifications.1</span></a>
<span id="notify-update" class="nav-notify"></span> <span id="notify-update" class="nav-notify"></span>
<ul id="nav-notifications-menu" class="menu-popup"> <ul id="nav-notifications-menu" class="menu-popup">
<li id="nav-notifications-see-all"><a href="/notifications/network">See all notifications</a></li>
<li class="empty">$emptynotifications</li> <li class="empty">$emptynotifications</li>
</ul> </ul>
</li> </li>

13
view/notifications.tpl Normal file
View file

@ -0,0 +1,13 @@
<h1>Notifications</h1>
<p id="notification-listing-desc">
<a href="/notifications/network" class="button tabs {{if $activetab==network}}active{{endif}}">Network</a>
<a href="/notifications/home" class="button tabs {{if $activetab==home}}active{{endif}}">Home</a>
<a href="/notifications/intros" class="button tabs {{if $activetab==intros}}active{{endif}}">Introductions</a>
<a href="/message" class="button tabs">Messages</a>
</p>
<div class="notif-network-wrapper">
$notif_content
</div>

View file

@ -0,0 +1,3 @@
<div class="notif-item">
<a href="$item_link"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
</div>

View file

@ -0,0 +1,3 @@
<div class="notif-item">
<a href="$item_link"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
</div>

View file

@ -0,0 +1,3 @@
<div class="notif-item">
<a href="$item_link"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
</div>

View file

@ -0,0 +1,3 @@
<div class="notif-item">
<a href="$item_link"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
</div>

View file

@ -0,0 +1,3 @@
<div class="notif-item">
<a href="{$item_link}"><img src="{$item_image}" class="notif-image">{$item_text} <span class="notif-when">{$item_when}</span></a>
</div>

View file

@ -9,6 +9,7 @@
{{ if $nav.notifications }}<a rel="#nav-notifications-menu" id="intro-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }} {{ if $nav.notifications }}<a rel="#nav-notifications-menu" id="intro-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }}
{{ if $nav.messages }}<a rel="#nav-notifications-menu" id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }} {{ if $nav.messages }}<a rel="#nav-notifications-menu" id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }}
<ul id="nav-notifications-menu" class="menu-popup"> <ul id="nav-notifications-menu" class="menu-popup">
<li id="nav-notifications-see-all"><a href="/notifications/network">See all notifications</a></li>
<li class="empty">$emptynotifications</li> <li class="empty">$emptynotifications</li>
</ul> </ul>
</div> </div>
@ -54,5 +55,5 @@
</nav> </nav>
<ul id="nav-notifications-template" style="display:none;" rel="template"> <ul id="nav-notifications-template" style="display:none;" rel="template">
<a href="{0}"><li>{2} <span class="notif-when">{3}</span></li></a> <li><a href="{0}">{2} <span class="notif-when">{3}</span></a></li>
</ul> </ul>

View file

@ -113,10 +113,13 @@ input[type=submit]:active {
::-moz-selection { background:#fdf795; color: #000; /* Firefox */ } ::-moz-selection { background:#fdf795; color: #000; /* Firefox */ }
section { section {
margin: 20px 11% 0px 11%; float: left;
margin-left: 8%;
padding-top: 50px;
width: 50%;
margin: 20px 0px 30px 10%;
font-size: 0.9em; font-size: 0.9em;
line-height: 1.2em; line-height: 1.2em;
padding-right: 230px;
} }
.lframe { .lframe {
@ -256,9 +259,11 @@ section {
/* ======= */ /* ======= */
nav { nav {
z-index: 10000;
height: 50px; height: 50px;
display: block; display: block;
position: relative; position: fixed;
width: 100%;
padding: 0px 10%; padding: 0px 10%;
color: #efefef; color: #efefef;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) ); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) );
@ -273,7 +278,7 @@ nav a:hover { text-decoration: none; color: #eeeeec; border:0px;}
nav #banner { nav #banner {
display: block; display: block;
position: absolute; position: absolute;
margin-left: 20px; margin-left: 10px;
margin-top: 5px; margin-top: 5px;
padding-bottom:5px; padding-bottom:5px;
} }
@ -288,7 +293,7 @@ nav #user-menu {
display: block; display: block;
width: 250px; width: 250px;
float: right; float: right;
margin-right:15px; margin-right:20%;
margin-top: 10px; margin-top: 10px;
padding: 5px; padding: 5px;
position: relative; position: relative;
@ -361,7 +366,7 @@ ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:in
#notifications { #notifications {
height: 32px; height: 32px;
position: absolute; position: absolute;
top:10px; left: 40%; top:10px; left: 35%;
} }
.nav-ajax-update { .nav-ajax-update {
width: 44px; width: 44px;
@ -431,10 +436,11 @@ ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:in
/* ================= */ /* ================= */
aside { aside {
position: absolute; float: right;
right: 11%; margin-right: 10%;
width: 260px; /*width: 21%;*/
margin-top: auto; width: 250px;
margin-top: 50px;
font-size: 0.8em; font-size: 0.8em;
font-style: bold; font-style: bold;
} }
@ -475,16 +481,15 @@ aside a{
aside h4 { font-size: 1.3em; } aside h4 { font-size: 1.3em; }
aside #viewcontacts { .allcontact-link {
color: #626262;
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
font-variant:small-caps; font-variant:small-caps;
font-size: 1.1em; font-size: 1.1em;
padding-top: 5px;
} }
.allcontact-link a {
#viewcontacts a { padding-bottom: 10px;
color: #898989;
} }
#profile-extra-links ul { margin-left: 0px; padding-left: 0px; list-style: none; } #profile-extra-links ul { margin-left: 0px; padding-left: 0px; list-style: none; }
@ -841,7 +846,7 @@ profile-jot-banner-wrapper {
/* ========= */ /* ========= */
.wall-item-outside-wrapper { .wall-item-outside-wrapper {
max-width: 83%; max-width: 93%;
border-bottom: 1px solid #dedede; border-bottom: 1px solid #dedede;
margin-top: 20px; margin-top: 20px;
padding-right: 10px; padding-right: 10px;
@ -2341,6 +2346,7 @@ margin-left: 0px;
padding: 20px; padding: 20px;
padding-top: 10px; padding-top: 10px;
margin: 0 0px; margin: 0 0px;
margin-bottom: 10px;
background-color: #fff; background-color: #fff;
-webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
@ -3030,7 +3036,7 @@ ul.menu-popup {
#nav-notifications-menu { #nav-notifications-menu {
width: 320px; width: 320px;
max-height: 400px; max-height: 400px;
overflow-y: scroll; overflow-y: scroll;overflow-style:scrollbar;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) ); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) );
background:-moz-linear-gradient( center top, #797979 5%, #898988 100% ); background:-moz-linear-gradient( center top, #797979 5%, #898988 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988'); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988');
@ -3049,7 +3055,7 @@ ul.menu-popup {
#nav-notifications-menu img { float: left; margin-right: 5px; } #nav-notifications-menu img { float: left; margin-right: 5px; }
#nav-notifications-menu .notif-when { font-size: 0.8em; display: block; } #nav-notifications-menu .notif-when { font-size: 0.8em; display: block; }
#nav-notifications-menu li { #nav-notifications-menu li {
padding: 7px 10px 7px 10px; padding: 7px 0px 7px 10px;
word-wrap:normal; word-wrap:normal;
border-bottom: 1px solid #626262; border-bottom: 1px solid #626262;
} }
@ -3060,3 +3066,23 @@ ul.menu-popup {
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808'); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
background-color:#b20202; background-color:#b20202;
} }
.notif-item a {
vertical-align: middle;
color: #626262;
padding-bottom: 7px;
}
.notif-item a:hover {
color: #b20202;
}
.notif-image {
width: 32px;
height: 32px;
padding: 7px 7px 0px 0px;
}
#jGrowl {
z-index: 20000;
}