|
mark@3
|
1 |
<?page
|
|
mark@3
|
2 |
body<=
|
|
mark@3
|
3 |
<?_code
|
|
mark@3
|
4 |
{
|
|
mark@3
|
5 |
use strict;
|
|
mark@3
|
6 |
use vars qw($title $body $head %GET %POST);
|
|
mark@3
|
7 |
use Class::Autouse qw (
|
|
mark@3
|
8 |
LJ::NotificationInbox
|
|
mark@3
|
9 |
LJ::Event
|
|
mark@3
|
10 |
);
|
|
mark@3
|
11 |
|
|
mark@84
|
12 |
$title = $ML{'.title'};
|
|
mark@3
|
13 |
$body = "";
|
|
mark@3
|
14 |
|
|
mark@3
|
15 |
my $remote = LJ::get_remote()
|
|
mark@3
|
16 |
or return "<?needlogin?>";
|
|
mark@3
|
17 |
|
|
mark@84
|
18 |
return $ML{'.error.not_ready'} unless $remote->can_use_esn;
|
|
mark@3
|
19 |
|
|
mark@3
|
20 |
LJ::need_res(qw(
|
|
mark@3
|
21 |
js/core.js
|
|
mark@3
|
22 |
js/dom.js
|
|
mark@3
|
23 |
js/view.js
|
|
mark@3
|
24 |
js/controller.js
|
|
mark@3
|
25 |
js/datasource.js
|
|
mark@3
|
26 |
js/checkallbutton.js
|
|
mark@3
|
27 |
js/selectable_table.js
|
|
mark@3
|
28 |
js/httpreq.js
|
|
mark@3
|
29 |
js/hourglass.js
|
|
mark@3
|
30 |
js/esn_inbox.js
|
|
mark@3
|
31 |
stc/esn.css
|
|
mark@3
|
32 |
stc/lj_base.css
|
|
mark@3
|
33 |
));
|
|
mark@3
|
34 |
|
|
mark@3
|
35 |
my $formauth = LJ::form_auth();
|
|
mark@3
|
36 |
|
|
mark@3
|
37 |
# get the user's inbox
|
|
mark@3
|
38 |
my $inbox = $remote->notification_inbox
|
|
mark@84
|
39 |
or return LJ::error_list( BML::ml('.error.couldnt_retrieve_inbox', { 'user' => $remote->{user} }) );
|
|
mark@3
|
40 |
|
|
mark@3
|
41 |
# 2 instances of action buttons
|
|
mark@3
|
42 |
# map each to one variable
|
|
mark@84
|
43 |
my @buttons = qw{markRead markUnread delete markAllRead deleteAll};
|
|
mark@3
|
44 |
foreach my $button (@buttons) {
|
|
mark@3
|
45 |
for (my $i=1; $i<=2; $i++) {
|
|
mark@3
|
46 |
my $sfx_button = $button . "_" . $i;
|
|
mark@3
|
47 |
$GET{$button} = $GET{$sfx_button} if($GET{$sfx_button} && !$GET{$button});
|
|
mark@3
|
48 |
$POST{$button} = $POST{$sfx_button} if($POST{$sfx_button} && !$POST{$button});
|
|
mark@3
|
49 |
}
|
|
mark@3
|
50 |
}
|
|
mark@3
|
51 |
|
|
mark@3
|
52 |
# Take a supplied filter but default it to undef unless it is valid
|
|
mark@3
|
53 |
my $view = $POST{view} || $GET{view} || undef;
|
|
mark@3
|
54 |
$view = undef if ($view eq 'archive' && $LJ::DISABLED{esn_archive});
|
|
mark@3
|
55 |
$view = undef if ($view && !LJ::NotificationInbox->can("${view}_items"));
|
|
mark@3
|
56 |
|
|
mark@3
|
57 |
# Bolds the selected View/Folder
|
|
mark@3
|
58 |
my $selected_folder = $view || 'all';
|
|
mark@3
|
59 |
$selected_folder = qq(
|
|
mark@3
|
60 |
<style>#esn_folder_$selected_folder {
|
|
mark@3
|
61 |
font-weight: bold;
|
|
mark@707
|
62 |
background-color: #ffd8d8;
|
|
mark@3
|
63 |
border: 1px solid #bbb;
|
|
mark@3
|
64 |
}</style>
|
|
mark@3
|
65 |
);
|
|
mark@3
|
66 |
$head = $selected_folder;
|
|
mark@3
|
67 |
|
|
mark@3
|
68 |
# get events sitting in inbox
|
|
mark@3
|
69 |
my @notifications = $inbox->items;
|
|
mark@3
|
70 |
|
|
mark@3
|
71 |
my @errors;
|
|
mark@3
|
72 |
|
|
mark@3
|
73 |
if (LJ::did_post()) {
|
|
mark@3
|
74 |
|
|
mark@3
|
75 |
# operate on notices by default but switch if view parameter specified
|
|
mark@3
|
76 |
my $nitems = \@notifications;
|
|
mark@3
|
77 |
my $name = "all";
|
|
mark@3
|
78 |
if ($view) {
|
|
mark@3
|
79 |
my @items = eval "\$inbox->${name}_items";
|
|
mark@84
|
80 |
push @items, $inbox->usermsg_sent_items;
|
|
mark@3
|
81 |
$nitems = \@items;
|
|
mark@3
|
82 |
}
|
|
mark@3
|
83 |
|
|
mark@3
|
84 |
if ($POST{markAllRead}) {
|
|
mark@84
|
85 |
$inbox->mark_all_read( $view );
|
|
mark@84
|
86 |
} elsif ($POST{deleteAll}) {
|
|
mark@84
|
87 |
$inbox->delete_all( $view );
|
|
mark@3
|
88 |
} else {
|
|
mark@3
|
89 |
# go through each item and see if it's checked
|
|
mark@3
|
90 |
foreach my $item (@$nitems) {
|
|
mark@3
|
91 |
my $qid = eval { $item->qid } or next;
|
|
mark@3
|
92 |
my $checked = $POST{"${name}_Check-$qid"};
|
|
mark@3
|
93 |
next unless $checked;
|
|
mark@3
|
94 |
|
|
mark@3
|
95 |
if ($POST{markRead}) {
|
|
mark@3
|
96 |
$item->mark_read;
|
|
mark@3
|
97 |
} elsif ($POST{markUnread}) {
|
|
mark@3
|
98 |
$item->mark_unread;
|
|
mark@3
|
99 |
} elsif ($POST{delete}) {
|
|
mark@3
|
100 |
$item->delete;
|
|
mark@3
|
101 |
}
|
|
mark@3
|
102 |
}
|
|
mark@3
|
103 |
|
|
mark@3
|
104 |
# reload inbox after making changes
|
|
mark@3
|
105 |
@$nitems = eval "\$inbox->${name}_items";
|
|
mark@3
|
106 |
}
|
|
mark@3
|
107 |
}
|
|
mark@3
|
108 |
|
|
mark@3
|
109 |
# Allow bookmarking to work without Javascript
|
|
mark@3
|
110 |
# or before JS events are bound
|
|
mark@3
|
111 |
if ($GET{bookmark_off} && $GET{bookmark_off} =~ /^\d+$/) {
|
|
mark@84
|
112 |
push @errors, $ML{'.error.max_bookmarks'}
|
|
mark@3
|
113 |
unless $inbox->add_bookmark($GET{bookmark_off});
|
|
mark@3
|
114 |
}
|
|
mark@3
|
115 |
if ($GET{bookmark_on} && $GET{bookmark_on} =~ /^\d+$/) {
|
|
mark@3
|
116 |
$inbox->remove_bookmark($GET{bookmark_on});
|
|
mark@3
|
117 |
}
|
|
mark@3
|
118 |
|
|
mark@3
|
119 |
# Pagination
|
|
mark@3
|
120 |
my $page = int($POST{page} || $GET{page});
|
|
mark@3
|
121 |
|
|
mark@3
|
122 |
$body .= LJ::error_list(@errors) if (@errors);
|
|
mark@3
|
123 |
|
|
mark@3
|
124 |
$body .= qq{
|
|
mark@84
|
125 |
<div class="inbox_newitems pkg">
|
|
mark@84
|
126 |
<span class="esnlinks"><a href="$LJ::SITEROOT/inbox/?page=$page" id="RefreshLink"><?_ml inbox.refresh _ml?></a> | <a href="$LJ::SITEROOT/manage/subscriptions/"><?_ml inbox.manage_settings _ml?></a></span>
|
|
mark@84
|
127 |
</div> };
|
|
mark@84
|
128 |
|
|
mark@84
|
129 |
# Inbox Nav
|
|
mark@84
|
130 |
$body .= qq{
|
|
mark@84
|
131 |
<table style="width: 100%"><tr><td valign="top" style="padding-right: 12px">};
|
|
mark@84
|
132 |
$body .= LJ::Widget::InboxFolderNav->render( 'page' => 1 );
|
|
mark@3
|
133 |
|
|
mark@3
|
134 |
$body .= qq{
|
|
mark@3
|
135 |
</td>
|
|
mark@3
|
136 |
<td width="1" height="100%" style="border-left: 1px solid #ccc"><img src="$LJ::IMGPREFIX/spacer.gif"></td>
|
|
mark@3
|
137 |
<td valign="top" style="padding-left: 10px; width: 100%;">
|
|
mark@3
|
138 |
};
|
|
mark@3
|
139 |
|
|
mark@3
|
140 |
# Filter by view if specified
|
|
mark@3
|
141 |
my @all_items;
|
|
mark@3
|
142 |
if ($view) {
|
|
mark@3
|
143 |
@all_items = eval "\$inbox->${view}_items";
|
|
mark@3
|
144 |
} else {
|
|
mark@3
|
145 |
@all_items = $inbox->all_items;
|
|
mark@3
|
146 |
}
|
|
mark@3
|
147 |
|
|
mark@84
|
148 |
# Pagination
|
|
mark@84
|
149 |
my $page = int($POST{page} || $GET{page});
|
|
mark@84
|
150 |
|
|
mark@3
|
151 |
$body .= LJ::Widget::InboxFolder->render(
|
|
mark@3
|
152 |
folder => "all",
|
|
mark@3
|
153 |
reply_btn => 1,
|
|
mark@3
|
154 |
expand => $GET{expand},
|
|
mark@3
|
155 |
inbox => $inbox,
|
|
mark@3
|
156 |
page => $page,
|
|
mark@3
|
157 |
view => $view,
|
|
mark@3
|
158 |
mode => $GET{mode},
|
|
mark@3
|
159 |
items => \@all_items);
|
|
mark@3
|
160 |
|
|
mark@3
|
161 |
$body .= qq{
|
|
mark@3
|
162 |
</td></tr></table>
|
|
mark@3
|
163 |
};
|
|
mark@3
|
164 |
|
|
mark@3
|
165 |
return $body;
|
|
mark@3
|
166 |
}
|
|
mark@3
|
167 |
_code?>
|
|
mark@3
|
168 |
<=body
|
|
mark@3
|
169 |
title=><?_code return $title; _code?>
|
|
mark@3
|
170 |
head<=
|
|
mark@3
|
171 |
|
|
mark@3
|
172 |
<?_code return $head; _code?>
|
|
mark@3
|
173 |
|
|
mark@3
|
174 |
<script>
|
|
mark@3
|
175 |
LJ_cmtinfo = {};
|
|
mark@3
|
176 |
LJ_cmtinfo['disableInlineDelete'] = 1;
|
|
mark@3
|
177 |
var pageNum;
|
|
mark@84
|
178 |
var cur_folder = '<?_code return $POST{view} || $GET{view} || undef; _code?>';
|
|
mark@3
|
179 |
|
|
mark@84
|
180 |
DOM.addEventListener(window, "load", setup, cur_folder);
|
|
mark@3
|
181 |
|
|
mark@3
|
182 |
var tableview;
|
|
mark@3
|
183 |
var checkallButton;
|
|
mark@3
|
184 |
/* Can have multiple tables or folders displayed on the same page */
|
|
mark@3
|
185 |
var folders = ['all'];
|
|
mark@3
|
186 |
|
|
mark@3
|
187 |
function setup (e) {
|
|
mark@3
|
188 |
if (! Site.has_remote) return;
|
|
mark@3
|
189 |
|
|
mark@3
|
190 |
for (var i=0; i<folders.length; i++) {
|
|
mark@3
|
191 |
var name = folders[i];
|
|
mark@3
|
192 |
tableview = new View();
|
|
mark@3
|
193 |
|
|
mark@3
|
194 |
tableview.init({ "view": $(name + "_Table") });
|
|
mark@3
|
195 |
|
|
mark@3
|
196 |
// 2 instances of action buttons
|
|
mark@3
|
197 |
for (var i=1; i<=2; i++) {
|
|
mark@3
|
198 |
checkallButton = new CheckallButton();
|
|
mark@3
|
199 |
checkallButton.init({
|
|
mark@3
|
200 |
"class": "InboxItem_Check",
|
|
mark@3
|
201 |
"button": $(name + "_CheckAll_" + i),
|
|
mark@3
|
202 |
"parent": tableview.getView()
|
|
mark@3
|
203 |
});
|
|
mark@3
|
204 |
}
|
|
mark@3
|
205 |
}
|
|
mark@3
|
206 |
|
|
mark@3
|
207 |
// 2 instances of action buttons
|
|
mark@3
|
208 |
for (var i=1; i<=2; i++) {
|
|
mark@3
|
209 |
DOM.addEventListener($("Page_Prev_"+i), "click", Page_Prev);
|
|
mark@3
|
210 |
DOM.addEventListener($("Page_Next_"+i), "click", Page_Next);
|
|
mark@3
|
211 |
}
|
|
mark@3
|
212 |
|
|
mark@3
|
213 |
if ($("pageNum")) pageNum = parseInt($("pageNum").value);
|
|
mark@3
|
214 |
}
|
|
mark@3
|
215 |
|
|
mark@3
|
216 |
function xtra_args () {
|
|
mark@3
|
217 |
var args = '';
|
|
mark@3
|
218 |
var view = $("inbox_view").value;
|
|
mark@3
|
219 |
if (view) args += "&view=" + view;
|
|
mark@3
|
220 |
return args;
|
|
mark@3
|
221 |
}
|
|
mark@3
|
222 |
|
|
mark@3
|
223 |
function Page_Prev (e) {
|
|
mark@3
|
224 |
if (pageNum) {
|
|
mark@3
|
225 |
var args = xtra_args();
|
|
mark@3
|
226 |
window.location.href = "<?siteroot?>/inbox/?page=" + (pageNum - 1) + args;
|
|
mark@3
|
227 |
}
|
|
mark@3
|
228 |
}
|
|
mark@3
|
229 |
|
|
mark@3
|
230 |
function Page_Next (e) {
|
|
mark@3
|
231 |
if (pageNum) {
|
|
mark@3
|
232 |
var args = xtra_args();
|
|
mark@3
|
233 |
window.location.href = "<?siteroot?>/inbox/?page=" + (pageNum + 1) + args;
|
|
mark@3
|
234 |
}
|
|
mark@3
|
235 |
}
|
|
mark@3
|
236 |
|
|
mark@3
|
237 |
</script>
|
|
mark@3
|
238 |
|
|
mark@3
|
239 |
<=head
|
|
mark@3
|
240 |
|
|
mark@3
|
241 |
page?>
|