From 86765b012fbdef3b53756da87c6cdc0369a45d83 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Wed, 18 Feb 2015 21:29:41 +0000 Subject: [PATCH] LP#1410369: patron message center page in TPac This patch adds My Account tab in TPac for displaying and managing patron messages. In particular, a logged in patron will be able to: - see a list of their (undeleted) messages - open a particular message and see it's body; doing this automatically marks the message as read - delete messages from either the list or single-message views - mark messages as unread from the list or single-message views - mark messages as read from the list view Signed-off-by: Galen Charlton Signed-off-by: Kathy Lussier --- .../src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm | 1 + .../lib/OpenILS/WWW/EGCatLoader/Account.pm | 170 +++++++++++++++++++++ Open-ILS/src/templates/opac/css/style.css.tt2 | 9 +- Open-ILS/src/templates/opac/myopac/messages.tt2 | 16 ++ .../src/templates/opac/myopac/messages/list.tt2 | 113 ++++++++++++++ .../opac/myopac/messages/single_message.tt2 | 51 +++++++ Open-ILS/src/templates/opac/parts/myopac/base.tt2 | 1 + 7 files changed, 357 insertions(+), 4 deletions(-) create mode 100644 Open-ILS/src/templates/opac/myopac/messages.tt2 create mode 100644 Open-ILS/src/templates/opac/myopac/messages/list.tt2 create mode 100644 Open-ILS/src/templates/opac/myopac/messages/single_message.tt2 diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm index 856b7dece0..afcd8a9cdf 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm @@ -184,6 +184,7 @@ sub load { return $self->load_place_hold if $path =~ m|opac/place_hold|; return $self->load_myopac_holds if $path =~ m|opac/myopac/holds|; return $self->load_myopac_circs if $path =~ m|opac/myopac/circs|; + return $self->load_myopac_messages if $path =~ m|opac/myopac/messages|; return $self->load_myopac_payment_form if $path =~ m|opac/myopac/main_payment_form|; return $self->load_myopac_payments if $path =~ m|opac/myopac/main_payments|; return $self->load_myopac_pay_init if $path =~ m|opac/myopac/main_pay_init|; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm index 4a2b5dcbcc..514bc61055 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm @@ -264,6 +264,176 @@ sub fetch_optin_prefs { return [map { {cust => $_, value => $user_set->{$_->name} } } @$opt_ins]; } +sub load_myopac_messages { + my $self = shift; + my $e = $self->editor; + my $ctx = $self->ctx; + my $cgi = $self->cgi; + + my $limit = $cgi->param('limit') || 20; + my $offset = $cgi->param('offset') || 0; + + my $pcrud = OpenSRF::AppSession->create('open-ils.pcrud'); + $pcrud->connect(); + + my $action = $cgi->param('action') || ''; + if ($action) { + my ($changed, $failed) = $self->_handle_message_action($pcrud, $action); + if ($changed > 0 || $failed > 0) { + $ctx->{message_update_action} = $action; + $ctx->{message_update_changed} = $changed; + $ctx->{message_update_failed} = $failed; + } + } + + my $single = $cgi->param('single') || 0; + my $id = $cgi->param('message_id'); + + my $messages; + my $fetch_all = 1; + if (!$action && $single && $id) { + $messages = $self->_fetch_and_mark_read_single_message($pcrud, $id); + if (scalar(@$messages) == 1) { + $ctx->{display_single_message} = 1; + $ctx->{patron_message_id} = $id; + $fetch_all = 0; + } + } + + if ($fetch_all) { + # fetch all the messages + ($ctx->{patron_messages_count}, $messages) = + $self->_fetch_user_messages($pcrud, $offset, $limit); + } + + $pcrud->kill_me; + + foreach my $aum (@$messages) { + + push @{ $ctx->{patron_messages} }, { + id => $aum->id, + title => $aum->title, + message => $aum->message, + create_date => $aum->create_date, + is_read => defined($aum->read_date) ? 1 : 0, + library => $aum->sending_lib->name, + }; + } + + $ctx->{patron_messages_limit} = $limit; + $ctx->{patron_messages_offset} = $offset; + + return Apache2::Const::OK; +} + +sub _fetch_and_mark_read_single_message { + my $self = shift; + my $pcrud = shift; + my $id = shift; + + $pcrud->request('open-ils.pcrud.transaction.begin', $self->editor->authtoken)->gather(1); + my $messages = $pcrud->request( + 'open-ils.pcrud.search.aum.atomic', + $self->editor->authtoken, + { + usr => $self->editor->requestor->id, + deleted => 'f', + id => $id, + }, + { + flesh => 1, + flesh_fields => { aum => ['sending_lib'] }, + } + )->gather(1); + if (@$messages) { + $messages->[0]->read_date('now'); + $pcrud->request( + 'open-ils.pcrud.update.aum', + $self->editor->authtoken, + $messages->[0] + )->gather(1); + } + $pcrud->request('open-ils.pcrud.transaction.commit', $self->editor->authtoken)->gather(1); + + return $messages; +} + +sub _fetch_user_messages { + my $self = shift; + my $pcrud = shift; + my $offset = shift; + my $limit = shift; + + my %paging = ($limit or $offset) ? (limit => $limit, offset => $offset) : (); + + my $all_messages = $pcrud->request( + 'open-ils.pcrud.id_list.aum.atomic', + $self->editor->authtoken, + { + usr => $self->editor->requestor->id, + deleted => 'f' + }, + {} + )->gather(1); + + my $messages = $pcrud->request( + 'open-ils.pcrud.search.aum.atomic', + $self->editor->authtoken, + { + usr => $self->editor->requestor->id, + deleted => 'f' + }, + { + flesh => 1, + flesh_fields => { aum => ['sending_lib'] }, + order_by => { aum => 'create_date DESC' }, + %paging + } + )->gather(1); + + return scalar(@$all_messages), $messages; +} + +sub _handle_message_action { + my $self = shift; + my $pcrud = shift; + my $action = shift; + my $cgi = $self->cgi; + + my @ids = $cgi->param('message_id'); + return (0, 0) unless @ids; + + my $changed = 0; + my $failed = 0; + $pcrud->request('open-ils.pcrud.transaction.begin', $self->editor->authtoken)->gather(1); + for my $id (@ids) { + my $aum = $pcrud->request( + 'open-ils.pcrud.retrieve.aum', + $self->editor->authtoken, + $id + )->gather(1); + next unless $aum; + if ($action eq 'mark_read') { + $aum->read_date('now'); + } elsif ($action eq 'mark_unread') { + $aum->clear_read_date(); + } elsif ($action eq 'mark_deleted') { + $aum->deleted('t'); + } + $pcrud->request('open-ils.pcrud.update.aum', $self->editor->authtoken, $aum)->gather(1) ? + $changed++ : + $failed++; + } + if ($failed) { + $pcrud->request('open-ils.pcrud.transaction.rollback', $self->editor->authtoken)->gather(1); + $changed = 0; + $failed = scalar(@ids); + } else { + $pcrud->request('open-ils.pcrud.transaction.commit', $self->editor->authtoken)->gather(1); + } + return ($changed, $failed); +} + sub _load_lists_and_settings { my $self = shift; my $e = $self->editor; diff --git a/Open-ILS/src/templates/opac/css/style.css.tt2 b/Open-ILS/src/templates/opac/css/style.css.tt2 index 76b57093f6..277e82b90f 100644 --- a/Open-ILS/src/templates/opac/css/style.css.tt2 +++ b/Open-ILS/src/templates/opac/css/style.css.tt2 @@ -886,7 +886,7 @@ div.result_table_utils_cont { /*padding-left:10px;*/ } -#acct_checked_main_header, #acct_holds_main_header, #acct_checked_hist_header, #acct_list_header, #acct_list_header_anon, #temp_list_holds { +#acct_checked_main_header, #acct_holds_main_header, #acct_checked_hist_header, #acct_list_header, #acct_list_header_anon, #temp_list_holds, #acct_messages_main_header { border-collapse: collapse; } @@ -897,12 +897,12 @@ div.result_table_utils_cont { .hold_note_title { font-weight: bold; } -#acct_checked_main_header td, #acct_holds_main_header td, #acct_checked_hist_header td, #acct_list_header td, #acct_list_header_anon td, #temp_list_holds td { +#acct_checked_main_header td, #acct_holds_main_header td, #acct_checked_hist_header td, #acct_list_header td, #acct_list_header_anon td, #temp_list_holds td, #acct_messages_main_header td { background: [% css_colors.accent_lighter2 %]; padding: 10px; } -#acct_checked_main_header th, #acct_holds_main_header th, #acct_checked_hist_header th, #acct_list_header th, #acct_list_header_anon th, #temp_list_holds th { +#acct_checked_main_header th, #acct_holds_main_header th, #acct_checked_hist_header th, #acct_list_header th, #acct_list_header_anon th, #temp_list_holds th, #acct_messages_main_header th { text-align: left; padding: 0px 10px 0px 10px; } @@ -1134,7 +1134,7 @@ div#facet_sidebar { padding-left: 1em; } #opac.result.sort { width: 160px; } -.renew-summary { font-size: [% css_fonts.size_bigger %]; font-style: italic; margin: 0.5ex 0; } +.renew-summary, .message-update-summary { font-size: [% css_fonts.size_bigger %]; font-style: italic; margin: 0.5ex 0; } .failure-text { margin-left: 4em; font-style: italic; color: [% css_colors.text_alert %]; } .refine-controls { font-size: [% css_fonts.size_bigger %]; padding: 0.5ex 0; } #adv_search_refine input[type=text] { border: 1px inset [% css_colors.accent_light %] !important; } @@ -1199,6 +1199,7 @@ a.dash-link:hover { text-decoration: underline !important; } .results-paginator-list { padding-left: 1em; } .results-paginator-selected { color: [% css_colors.text_alert %]; } .inactive-hold { background: [% css_colors.accent_lightest %]; } +.unread-patron-message { font-weight: bold; } #hold-items-list td { padding: 5px; margin-bottom: 20px; } .hold-items-list-title { font-size: [% css_fonts.size_bigger %]; } diff --git a/Open-ILS/src/templates/opac/myopac/messages.tt2 b/Open-ILS/src/templates/opac/myopac/messages.tt2 new file mode 100644 index 0000000000..1cecd7041f --- /dev/null +++ b/Open-ILS/src/templates/opac/myopac/messages.tt2 @@ -0,0 +1,16 @@ +[% PROCESS "opac/parts/header.tt2"; + PROCESS "opac/parts/misc_util.tt2"; + WRAPPER "opac/parts/myopac/base.tt2"; + myopac_page = "messages"; + limit = (ctx.patron_messages_limit.defined) ? ctx.patron_messages_limit : 20; + offset = (ctx.patron_messages_offset.defined) ? ctx.patron_messages_offset : 0; + count = (ctx.patron_messages_count.defined) ? ctx.patron_messages_count : 0; + display_single = (ctx.display_single_message.defined) ? ctx.display_single_message : 0; +%] +

[% l('My Messages') %]

+[% IF display_single; + PROCESS "opac/myopac/messages/single_message.tt2"; +ELSE; + PROCESS "opac/myopac/messages/list.tt2"; +END %] +[% END %] diff --git a/Open-ILS/src/templates/opac/myopac/messages/list.tt2 b/Open-ILS/src/templates/opac/myopac/messages/list.tt2 new file mode 100644 index 0000000000..94dd00e47d --- /dev/null +++ b/Open-ILS/src/templates/opac/myopac/messages/list.tt2 @@ -0,0 +1,113 @@ +
+
+ [% l("Messages") %]
+ + limit, offset => (offset - limit)} ) %]' + [% IF offset <= 0 %] class='invisible' [% END %]>[% l('Previous') %] + [% IF offset > 0 || count > limit; + curpage = 0; + WHILE curpage * limit < count; + IF curpage * limit == offset; + %] + [% curpage + 1 %] + [%- ELSE %] + limit, offset => (curpage * limit)}) %]'>[% curpage + 1 %] + [%- END; + curpage = curpage + 1; + END; + END %] + limit, offset => (offset + limit)}) %]' + [% IF count <= limit + offset %] class='invisible' [% END %] >[% l('Next') %] + +
+
+ [% IF ctx.message_update_action.defined %] + [% IF ctx.message_update_changed > 0 %] +
+ [% IF ctx.message_update_action == 'mark_read'; + l('Marked [_1] message(s) as read.', ctx.message_update_changed); + ELSIF ctx.message_update_action == 'mark_unread'; + l('Marked [_1] message(s) as unread.', ctx.message_update_changed); + ELSIF ctx.message_update_action == 'mark_unread'; + l('Deleted [_1] message(s).', ctx.message_update_changed); + END + %] +
+ [% END %] + [% IF ctx.message_update_failed > 0 %] +
+ [% IF ctx.message_update_action == 'mark_read'; + l('Failed to mark [_1] message(s) as read.', ctx.message_update_failed); + ELSIF ctx.message_update_action == 'mark_unread'; + l('Failed to mark [_1] message(s) as unread.', ctx.message_update_failed); + ELSIF ctx.message_update_action == 'mark_unread'; + l('Failed to delete [_1] message(s).', ctx.message_update_failed); + END + %] +
+ [% END %] + [% END %] +
+
+
+
+ + + + + + + + [% l('Messages Help') %] + +
+ [% IF count < 1 %] +
[% l('No messages found.') %]
+ [% ELSE %] + + + + + + + + + + + [% FOR message IN ctx.patron_messages; %] + + + + + + + [% END %] + +
+ + [% l('Date') %][% l('Library') %][% l('Subject') %]
+ + [% date.format(ctx.parse_datetime(message.create_date), DATE_FORMAT); %][% message.library | html %][% message.title | html %]
+ [% END %] +
+
+ diff --git a/Open-ILS/src/templates/opac/myopac/messages/single_message.tt2 b/Open-ILS/src/templates/opac/myopac/messages/single_message.tt2 new file mode 100644 index 0000000000..3d6a82c444 --- /dev/null +++ b/Open-ILS/src/templates/opac/myopac/messages/single_message.tt2 @@ -0,0 +1,51 @@ +
+
+ [% l("Message") %]
+
+
+
+
+ + + + + + [% l('Return to Message List') %] + + + + +
+ + + + + + + + + + + + + + + + + + + + +
[% l("Date") %][% date.format(ctx.parse_datetime(ctx.patron_messages.0.create_date), DATE_FORMAT); %]
[% l("Library") %][% ctx.patron_messages.0.library | html %]
[% l("Subject") %][% ctx.patron_messages.0.title | html %]
[% l("Message") %][% ctx.patron_messages.0.message | html %]
+
+ diff --git a/Open-ILS/src/templates/opac/parts/myopac/base.tt2 b/Open-ILS/src/templates/opac/parts/myopac/base.tt2 index 8f8a5926f9..74426df03c 100644 --- a/Open-ILS/src/templates/opac/parts/myopac/base.tt2 +++ b/Open-ILS/src/templates/opac/parts/myopac/base.tt2 @@ -2,6 +2,7 @@ [% myopac_pages = [ {url => "main", name => l("Account Summary")}, + {url => "messages", name => l("Messages")}, {url => "circs", name => l("Items Checked Out")}, {url => "holds", name => l("Holds")}, {url => "prefs", name => l("Account Preferences")}, -- 2.11.0