297 lines
9.6 KiB
Text
297 lines
9.6 KiB
Text
|
|
<?_c
|
||
|
|
# This code was forked from the LiveJournal project owned and operated
|
||
|
|
# by Live Journal, Inc. The code has been modified and expanded by
|
||
|
|
# Dreamwidth Studios, LLC. These files were originally licensed under
|
||
|
|
# the terms of the license supplied by Live Journal, Inc, which can
|
||
|
|
# currently be found at:
|
||
|
|
#
|
||
|
|
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
|
||
|
|
#
|
||
|
|
# In accordance with the original license, this code and all its
|
||
|
|
# modifications are provided under the GNU General Public License.
|
||
|
|
# A copy of that license can be found in the LICENSE file included as
|
||
|
|
# part of this distribution.
|
||
|
|
_c?>
|
||
|
|
<?page
|
||
|
|
body<=
|
||
|
|
<?_code
|
||
|
|
{
|
||
|
|
use strict;
|
||
|
|
use vars qw($title $body $head $view %GET %POST);
|
||
|
|
use LJ::NotificationInbox;
|
||
|
|
use LJ::Event;
|
||
|
|
|
||
|
|
$title = $ML{'.title'};
|
||
|
|
$body = "";
|
||
|
|
|
||
|
|
my $remote = LJ::get_remote()
|
||
|
|
or return "<?needlogin?>";
|
||
|
|
|
||
|
|
return $ML{'.error.not_ready'} unless $remote->can_use_esn;
|
||
|
|
|
||
|
|
return BML::redirect( LJ::create_url( "/inbox/new", cur_args => \%GET, keep_args => 1 ) )
|
||
|
|
if ! LJ::did_post() && LJ::BetaFeatures->user_in_beta( $remote => "inbox" );
|
||
|
|
|
||
|
|
LJ::need_res(qw(
|
||
|
|
js/6alib/core.js
|
||
|
|
js/6alib/dom.js
|
||
|
|
js/6alib/view.js
|
||
|
|
js/6alib/datasource.js
|
||
|
|
js/6alib/checkallbutton.js
|
||
|
|
js/6alib/selectable_table.js
|
||
|
|
js/6alib/httpreq.js
|
||
|
|
js/6alib/hourglass.js
|
||
|
|
js/esn_inbox.js
|
||
|
|
stc/esn.css
|
||
|
|
stc/lj_base.css
|
||
|
|
));
|
||
|
|
|
||
|
|
my $formauth = LJ::form_auth();
|
||
|
|
|
||
|
|
# get the user's inbox
|
||
|
|
my $inbox = $remote->notification_inbox
|
||
|
|
or return LJ::error_list( BML::ml('.error.couldnt_retrieve_inbox', { 'user' => $remote->{user} }) );
|
||
|
|
|
||
|
|
# 2 instances of action buttons
|
||
|
|
# map each to one variable
|
||
|
|
my @buttons = qw{markRead markUnread delete markAllRead deleteAll};
|
||
|
|
foreach my $button (@buttons) {
|
||
|
|
for (my $i=1; $i<=2; $i++) {
|
||
|
|
my $sfx_button = $button . "_" . $i;
|
||
|
|
$GET{$button} = $GET{$sfx_button} if($GET{$sfx_button} && !$GET{$button});
|
||
|
|
$POST{$button} = $POST{$sfx_button} if($POST{$sfx_button} && !$POST{$button});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Take a supplied filter but default it to undef unless it is valid
|
||
|
|
$view = $POST{view} || $GET{view} || undef;
|
||
|
|
$view = undef if $view && $view =~ /\W/;
|
||
|
|
$view = undef if $view eq 'archive' && ! LJ::is_enabled('esn_archive');
|
||
|
|
$view = undef if $view && !LJ::NotificationInbox->can("${view}_items");
|
||
|
|
|
||
|
|
my $itemid = $view eq "singleentry" ? int( $POST{itemid} || $GET{itemid} || 0 ) : 0;
|
||
|
|
|
||
|
|
# Bolds the selected View/Folder
|
||
|
|
my $selected_folder = $view || 'all';
|
||
|
|
$selected_folder = "entrycomment" if $selected_folder eq "singleentry";
|
||
|
|
|
||
|
|
$selected_folder = qq(
|
||
|
|
<style>
|
||
|
|
.filterlink_$view {display: none;}
|
||
|
|
.entry-tags {text-align: right; font-style: italic;}
|
||
|
|
</style>
|
||
|
|
);
|
||
|
|
$head = $selected_folder;
|
||
|
|
|
||
|
|
# get events sitting in inbox
|
||
|
|
my @notifications = $inbox->items;
|
||
|
|
|
||
|
|
my @errors;
|
||
|
|
|
||
|
|
if (LJ::did_post()) {
|
||
|
|
|
||
|
|
# operate on notices by default but switch if view parameter specified
|
||
|
|
my $nitems = \@notifications;
|
||
|
|
my $name = "all";
|
||
|
|
if ($view) {
|
||
|
|
my @items = eval "\$inbox->${name}_items";
|
||
|
|
push @items, $inbox->usermsg_sent_items;
|
||
|
|
$nitems = \@items;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($POST{markAllRead}) {
|
||
|
|
$inbox->mark_all_read( $view, itemid => $itemid );
|
||
|
|
} elsif ($POST{deleteAll}) {
|
||
|
|
$inbox->delete_all( $view, itemid => $itemid );
|
||
|
|
} else {
|
||
|
|
# go through each item and see if it's checked
|
||
|
|
foreach my $item (@$nitems) {
|
||
|
|
my $qid = eval { $item->qid } or next;
|
||
|
|
my $checked = $POST{"${name}_Check-$qid"};
|
||
|
|
next unless $checked;
|
||
|
|
|
||
|
|
if ($POST{markRead}) {
|
||
|
|
$item->mark_read;
|
||
|
|
} elsif ($POST{markUnread}) {
|
||
|
|
$item->mark_unread;
|
||
|
|
} elsif ($POST{delete}) {
|
||
|
|
$item->delete;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# reload inbox after making changes
|
||
|
|
@$nitems = eval "\$inbox->${name}_items";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Allow bookmarking to work without Javascript
|
||
|
|
# or before JS events are bound
|
||
|
|
if ($GET{bookmark_off} && $GET{bookmark_off} =~ /^\d+$/) {
|
||
|
|
push @errors, $ML{'.error.max_bookmarks'}
|
||
|
|
unless $inbox->add_bookmark($GET{bookmark_off});
|
||
|
|
}
|
||
|
|
if ($GET{bookmark_on} && $GET{bookmark_on} =~ /^\d+$/) {
|
||
|
|
$inbox->remove_bookmark($GET{bookmark_on});
|
||
|
|
}
|
||
|
|
|
||
|
|
# Pagination
|
||
|
|
my $page = int($POST{page} || $GET{page});
|
||
|
|
|
||
|
|
$body .= LJ::error_list(@errors) if (@errors);
|
||
|
|
|
||
|
|
my $viewarg = $view ? "&view=$view" : "";
|
||
|
|
my $itemidarg = $itemid ? "&itemid=$itemid" : "";
|
||
|
|
|
||
|
|
# Inbox Nav
|
||
|
|
$body .= qq{
|
||
|
|
<table summary='' id="table_inbox" style="width: 100%"><tr><td id="table_inbox_folders" valign="top" style="padding-right: 12px">};
|
||
|
|
$body .= LJ::Widget::InboxFolderNav->render( 'page' => 1, 'view' => $view );
|
||
|
|
|
||
|
|
$body .= qq{
|
||
|
|
</td>
|
||
|
|
<td width="1" height="100%" style="border-left: 1px solid #ccc"><img src="$LJ::IMGPREFIX/spacer.gif" alt="" /></td>
|
||
|
|
<td id="table_inbox_messages" valign="top" style="padding-left: 10px; width: 100%;">
|
||
|
|
<div class="inbox_newitems pkg">
|
||
|
|
<span class="esnlinks" style="float: left"><a href="$LJ::SITEROOT/inbox/?page=$page$viewarg$itemidarg" id="RefreshLink"><?_ml inbox.refresh _ml?></a> |
|
||
|
|
<a href="$LJ::SITEROOT/manage/settings/?cat=notifications"><?_ml inbox.manage_settings _ml?></a></span>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
# Filter by view if specified
|
||
|
|
my @all_items;
|
||
|
|
if ($view) {
|
||
|
|
if ( $view eq "singleentry" ) {
|
||
|
|
@all_items = eval "\$inbox->${view}_items( $itemid )";
|
||
|
|
} else {
|
||
|
|
@all_items = eval "\$inbox->${view}_items";
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
@all_items = $inbox->all_items;
|
||
|
|
}
|
||
|
|
|
||
|
|
my $itemcount = scalar @all_items;
|
||
|
|
|
||
|
|
$body .= LJ::error_list( $@ ) if $@;
|
||
|
|
|
||
|
|
# Pagination
|
||
|
|
$page = int($POST{page} || $GET{page});
|
||
|
|
|
||
|
|
$body .= LJ::Widget::InboxFolder->render(
|
||
|
|
folder => "all",
|
||
|
|
reply_btn => 1,
|
||
|
|
expand => $GET{expand},
|
||
|
|
inbox => $inbox,
|
||
|
|
page => $page,
|
||
|
|
view => $view,
|
||
|
|
mode => $GET{mode},
|
||
|
|
items => \@all_items,
|
||
|
|
itemid => $itemid,
|
||
|
|
);
|
||
|
|
|
||
|
|
# Repeat refresh/manage links if we have more than a few items (15 max per page)
|
||
|
|
$body .= qq{
|
||
|
|
<div class="inbox_newitems pkg">
|
||
|
|
<span class="esnlinks" style="float: left"><a href="$LJ::SITEROOT/inbox/?page=$page$viewarg$itemidarg"><?_ml inbox.refresh _ml?></a> |
|
||
|
|
<a href="$LJ::SITEROOT/manage/settings/?cat=notifications"><?_ml inbox.manage_settings _ml?></a></span>
|
||
|
|
</div>
|
||
|
|
} if $itemcount > 10;
|
||
|
|
|
||
|
|
$body .= qq{
|
||
|
|
</td></tr></table>
|
||
|
|
};
|
||
|
|
|
||
|
|
# send the i18n variables to the js page context
|
||
|
|
$body .= "<script type='text/javascript'>\n";
|
||
|
|
$body .= "expanded = '$ML{'widget.inbox.notification.expanded'}';\n";
|
||
|
|
$body .= "collapsed = '$ML{'widget.inbox.notification.collapsed'}';\n";
|
||
|
|
$body .= "add_bookmark = '$ML{'widget.inbox.notification.add_bookmark'}';\n";
|
||
|
|
$body .= "rem_bookmark = '$ML{'widget.inbox.notification.rem_bookmark'}';\n";
|
||
|
|
$body .="</script>\n"; $body .= "</p>\n";
|
||
|
|
|
||
|
|
|
||
|
|
return $body;
|
||
|
|
}
|
||
|
|
_code?>
|
||
|
|
<=body
|
||
|
|
title=><?_code return $title; _code?>
|
||
|
|
head<=
|
||
|
|
|
||
|
|
<?_code return $head; _code?>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
LJ_cmtinfo = {};
|
||
|
|
LJ_cmtinfo['disableInlineDelete'] = 1;
|
||
|
|
var pageNum;
|
||
|
|
var cur_folder = '<?_code return $view; _code?>';
|
||
|
|
var itemid = <?_code return int( $POST{itemid} || $GET{itemid} || 0 ) _code?>;
|
||
|
|
|
||
|
|
document.addEventListener("DOMContentLoaded", setup, cur_folder);
|
||
|
|
|
||
|
|
var tableview;
|
||
|
|
var checkallButton;
|
||
|
|
/* Can have multiple tables or folders displayed on the same page */
|
||
|
|
var folders = ['all'];
|
||
|
|
|
||
|
|
function setup (e) {
|
||
|
|
if (! Site.has_remote) return;
|
||
|
|
|
||
|
|
for (var i=0; i<folders.length; i++) {
|
||
|
|
var name = folders[i];
|
||
|
|
tableview = new View();
|
||
|
|
|
||
|
|
tableview.init({ "view": $(name + "_Table"), "selectedClass": "selected" });
|
||
|
|
|
||
|
|
// 2 instances of action buttons
|
||
|
|
for (var i=1; i<=2; i++) {
|
||
|
|
checkallButton = new CheckallButton();
|
||
|
|
checkallButton.init({
|
||
|
|
"class": "InboxItem_Check",
|
||
|
|
"button": $(name + "_CheckAll_" + i),
|
||
|
|
"parent": tableview.getView()
|
||
|
|
});
|
||
|
|
if( checkallButton.button )
|
||
|
|
checkallButton.button.checked = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 2 instances of action buttons
|
||
|
|
for (var i=1; i<=2; i++) {
|
||
|
|
if( $("Page_Prev_"+i) )
|
||
|
|
DOM.addEventListener($("Page_Prev_"+i), "click", Page_Prev);
|
||
|
|
if( $("Page_Next_"+i) )
|
||
|
|
DOM.addEventListener($("Page_Next_"+i), "click", Page_Next);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($("pageNum")) pageNum = parseInt($("pageNum").value, 10);
|
||
|
|
}
|
||
|
|
|
||
|
|
function xtra_args () {
|
||
|
|
var args = '';
|
||
|
|
var view = $("inbox_view").value;
|
||
|
|
if (view) args += "&view=" + view;
|
||
|
|
if (itemid) args += "&itemid="+itemid;
|
||
|
|
return args;
|
||
|
|
}
|
||
|
|
|
||
|
|
function Page_Prev (e) {
|
||
|
|
if (pageNum) {
|
||
|
|
var args = xtra_args();
|
||
|
|
window.location.href = "<?siteroot?>/inbox/?page=" + (pageNum - 1) + args;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function Page_Next (e) {
|
||
|
|
if (pageNum) {
|
||
|
|
var args = xtra_args();
|
||
|
|
window.location.href = "<?siteroot?>/inbox/?page=" + (pageNum + 1) + args;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<=head
|
||
|
|
|
||
|
|
bodyopts=><?_code return "id='page_inbox' class='self_wrap'" _code?>
|
||
|
|
page?>
|