mourningdove/htdocs/inbox/index.bml
2026-05-24 01:03:05 +00:00

296 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?>