]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/templates/staff/circ/patron/index.tt2
LP#1264746 Add "email password reset" to user editor
[Evergreen.git] / Open-ILS / src / templates / staff / circ / patron / index.tt2
1 [%
2   WRAPPER "staff/base.tt2";
3   ctx.page_title = l("Patron"); 
4   ctx.page_app = "egPatronApp";
5   ctx.page_ctrl = "PatronCtrl";
6 %]
7
8 [% BLOCK APP_JS %]
9 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/grid.js"></script>
10 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
11 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/user.js"></script>
12 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
13 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/date.js"></script>
14 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/user-bucket.js"></script>
15 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/patrons.js"></script>
16 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/billing.js"></script>
17 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/circ.js"></script>
18 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/item.js"></script>
19 [% INCLUDE 'staff/circ/share/circ_strings.tt2' %]
20 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/holds.js"></script>
21 [% INCLUDE 'staff/circ/share/hold_strings.tt2' %]
22 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/record.js"></script>
23 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/patron_search.js"></script>
24 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/app.js"></script>
25 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/regctl.js"></script>
26
27 <!-- load the rest on demand? -->
28
29 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/checkout.js"></script>
30 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/items_out.js"></script>
31 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/holds.js"></script>
32 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/bills.js"></script>
33
34 <!-- TODO: APP_JS should really be called APP_ADDONS or some such.
35     It just means "load these things, too, and load them last" -->
36 <link rel="stylesheet" href="[% ctx.base_path %]/staff/css/circ.css" />
37
38 <script>
39 angular.module('egCoreMod').run(['egStrings', function(s) {
40   s.ANNOTATE_PAYMENT_MSG = "[% l('Please annotate this payment') %]";
41   s.CONFIRM_ADJUST_TO_ZERO = 
42     "[% |l('{{xactIds}}') -%]Are you sure you would like to adjust to zero the balance on bills [_1]?[% END %]";
43   s.CONFIRM_VOID_BILLINGS = 
44     "[% l('Are you sure you would like to void $[_1] for these line-item billings? [_2]','{{amount|number:2}}','{{billIds}}') %]";
45   s.CONFIRM_REFUND_PAYMENT = 
46     "[% |l('{{xactIds}}') -%]Are you sure you would like to refund excess payment on bills [_1]?  This action will simply put the amount in the Payment Pending column as a negative value.  You must still select Apply Payment!  Certain types of payments may not be refunded.  The refund may be applied to checked transactions that follow the refunded transaction.[% END %]";
47   s.EDIT_BILL_PAY_NOTE = "[% l('Enter new note for #[_1]:','{{ids}}') %]";
48   s.GROUP_ADD_USER = "[% l('Enter the patron barcode') %]";
49   s.RENEW_ITEMS = "[% l('Renew Items?') %]";
50   s.RENEW_ALL_ITEMS = "[% l('Renew All Items?') %]";
51   s.CHECK_IN_CONFIRM = "[% l('Check In Items?') %]";
52   s.REG_INVALID_FIELDS = 
53     "[% l('Please enter valid values for all required fields.') %]"
54   s.REG_PASSWORD_RESET_REQUEST_NO_EMAIL =
55     "[% l('An email address is required for a password reset link to be sent.') %]";
56   s.REG_PASSWORD_RESET_REQUEST_DIFFERENT_EMAIL =
57     "[% l('Patron email address appears to have been changed but not yet saved. Please save user before attempting to send password reset link.') %]";
58   s.REG_PASSWORD_RESET_REQUEST_SUCCESSFUL =
59     "[% l('Submitted request for password reset link to be sent via email.') %]";
60   s.PAYMENT_WARN_AMOUNT = "[% l('Are you sure you want to apply a payment of $[_1]?', '{{payment_amount}}') %]";
61   s.PAYMENT_WARN_AMOUNT_TITLE = "[% l('Verify Payment Amount') %]";
62   s.PAYMENT_OVER_MAX = "[% l('Payments over $[_1] are denied by policy.', '{{max_amount}}') %]";
63   s.PATRON_NOTE_DELETE_CONFIRM_TITLE = "[% l('Delete Note?') %]";
64   s.PATRON_NOTE_DELETE_CONFIRM = "[% l('Delete the note titled \"[_1]\" created on [_2]?', '{{note_title}}', '{{create_date | date}}') %]";
65   s.PATRON_PURGE_CONFIRM_TITLE = "[% l('Completely Purge Patron Account?') %]";
66   s.PATRON_PURGE_CONFIRM = "[% l('Completely OBLITERATE this patron account, including bills, payments, bookbags, etc? This is IRREVERSIBLE.') %]";
67   s.PATRON_PURGE_LAST_CHANCE = "[% l('Last chance, are you sure you want to completely delete this account?') %]";
68   s.PATRON_PURGE_STAFF_PROMPT = "[% l('The account you are attempting to delete has STAFF_LOGIN privileges. Please enter the barcode for a destination account to receive miscellaneous staff artifacts (reports, etc.) from the account to be deleted.') %]";
69   s.PATRON_PURGE_STAFF_BAD_BARCODE = "[% l('Could not retrieve a destination account with the barcode provided. Aborting the purge...') %]";
70   s.PATRON_PURGE_OVERRIDE_PROMPT = "[% l('The account has open transactions (circulations and/or unpaid bills). Purge anyway?') %]";
71   s.PATRON_EDIT_COLLISION = "[% l('Patron record was modified by another user while you were editing it. Your changes were not saved; please reapply them.') %]";
72   s.OPT_IN_DIALOG_TITLE = "[% l('Verify Permission to Share Personal Information') %]";
73   s.OPT_IN_DIALOG = "[% l('Does patron [_1], [_2] from [_3] ([_4]) consent to having their personal information shared with your library?', '{{family_name}}', '{{first_given_name}}', '{{org_name}}', '{{org_shortname}}') %]";
74   s.BUCKET_ADD_SUCCESS = "[% l('Successfully added [_1] users to bucket [_2].', '{{count}}', '{{name}}') %]";
75   s.BUCKET_ADD_FAIL = "[% l('Failed to add [_1] users to bucket [_2].', '{{count}}', '{{name}}') %]";
76   s.PAGE_TITLE_PATRON_SEARCH = "[% l('Patron Search') %]";
77   s.PAGE_TITLE_PATRON_NAME = "[% l('[_1], [_2] [_3]', '{{lname}}','{{fname}}','{{mname}}') %]";
78   s.PAGE_TITLE_PATRON_CHECKOUT = "[% l('Checkout') %]";
79   s.PAGE_TITLE_PATRON_MESSAGES = "[% l('Messages') %]";
80   /* TODO: The "Other" page title could be smarter.. */
81   s.PAGE_TITLE_PATRON_OTHER = "[% l('Other') %]";
82   s.PAGE_TITLE_PATRON_BILLS = "[% l('Bills') %]";
83   s.PAGE_TITLE_PATRON_HOLDS = "[% l('Holds') %]";
84   s.PAGE_TITLE_PATRON_ITEMS_OUT = "[% l('Items Out') %]";
85   s.PAGE_TITLE_PATRON_EDIT = "[% l('Edit') %]";
86   s.MERGE_SELF_NOT_ALLOWED = "[% l('Logged in account cannot be merged') %]";
87   s.TEST_NOTIFY_SUCCESS = "[% l('Test Notification sent') %]";
88   s.TEST_NOTIFY_FAIL = "[% l('Test Notification failed to send') %]";
89   s.REMOVE_HOLD_SUBSCRIPTIONS = "[% l('Remove selected Hold Groups for user?') %]";
90 }]);
91 </script>
92
93 <!-- add room for the fixed navigation elements -->
94 <style ng-if="is_patron_edit">
95   #top-content-container { padding-top: 120px; }
96 </style>
97 <style ng-if="!is_patron_edit">
98   #top-content-container { padding-top: 80px; }
99 </style>
100
101 [% END %]
102
103 <div class="row" id="patron-fixed-tabs">
104   <div class="col-md-3 patron-name-header">
105     <div ng-show="patron()">
106       <h4 title="{{patron().id()}}">
107         <div class="flex-row">
108           <div class="flex-cell"
109           ng-class="{'patron-summary-alert' : hasAlerts()}">
110             [% l('[_1] [_2], [_3] [_4] [_5]', 
111                 '{{patron().pref_prefix() || patron().prefix()}}',
112                 '{{patron().pref_family_name() || patron().family_name()}}',
113                 '{{patron().pref_first_given_name() || patron().first_given_name()}}',
114                 '{{patron().pref_second_given_name() || patron().second_given_name()}}',
115                 '{{patron().pref_suffix() || patron().suffix()}}') %]
116                <span ng-if="patron().name_keywords()"> <a title="[% l('Name keywords: ') %]{{patron().name_keywords()}}" class="glyphicon glyphicon-tags"></a>
117           </div>
118
119           <p ng-show="patron().notes().length > 0"><a class='patron-summary-has-notes' href="./circ/patron/{{patron().id()}}/notes"><span class="label label-warning">Notes &nbsp;{{patron().notes().length}}</span></a></p>
120           <div ng-show="tab != 'search'">
121             <a href ng-click="toggle_expand_summary()"
122               title="[% l('Collapse Patron Summary Display') %]"
123               ng-hide="collapse_summary()">
124               <span class="glyphicon glyphicon-resize-small"></span>
125             </a>
126             <a href ng-click="toggle_expand_summary()"
127               title="[% l('Expand Patron Summary Display') %]"
128               ng-show="collapse_summary()">
129               <span class="glyphicon glyphicon-resize-full"></span>
130             </a>
131           </div>
132         </div>
133       </h4>
134     </div>
135   </div>
136
137   <div class="col-md-9">
138     <ul class="nav nav-pills nav-pills-like-tabs">
139       <li ng-class="{active : tab == 'checkout', disabled : !patron()}">
140         <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/checkout">[% l('Check Out') %]</a>
141       </li>
142       <li ng-class="{active : tab == 'items_out', disabled : !patron()}">
143         <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/items_out">
144           [% l('Items Out') %] 
145           <span ng-if="patron()"><!-- lack of space / newline below intentional -->
146           (<span ng-class="{'patron-summary-alert-small' : patron_stats().checkouts.overdue}">{{patron_stats().checkouts.total_out}}</span>)
147           </span>
148         </a>
149       </li>
150       <li ng-class="{active : tab == 'holds', disabled : !patron()}">
151         <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/holds">
152           [% l('Holds') %]
153           <span ng-if="patron()">
154             (<span>{{patron_stats().holds.ready}} / {{patron_stats().holds.total}}</span>)
155           </span>
156         </a>
157       </li>
158       <li ng-class="{active : tab == 'bills', disabled : !patron()}">
159         <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/bills">
160           [% l('Bills') %]
161           <span ng-if="patron()">
162             (<span ng-class="{'patron-summary-alert-small' : patron_stats().fines.balance_owed}">{{patron_stats().fines.balance_owed | currency}}</span>)
163           </span>
164         </a>
165       </li>
166       <li ng-class="{active : tab == 'messages', disabled : !patron()}">
167         <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/messages">[% l('Messages') %]</a>
168       </li>
169       <li ng-class="{active : tab == 'edit', disabled : !patron()}">
170         <a href="./circ/patron/{{patron().id()}}/edit">[% l('Edit') %]</a>
171       </li>
172       <li uib-dropdown ng-class="{active : tab == 'other', disabled : !patron()}">
173         <a a-disabled="!patron()" href uib-dropdown-toggle>
174             [% l('Other') %]
175             <b class="caret"></b>
176         </a>
177         <ul uib-dropdown-menu>
178           <li>
179             <a href="./circ/patron/{{patron().id()}}/alerts">
180               [% l('Display Alert and Messages') %]
181             </a>
182           </li>
183           <li>
184             <a href="./circ/patron/{{patron().id()}}/notes">
185               [% l('Notes') %]
186             </a>
187           </li>
188           <li>
189             <a href="./circ/patron/{{patron().id()}}/triggered_events">
190               [% l('Triggered Events / Notifications') %]
191             </a>
192           </li>
193           <li>
194             <a href="./circ/patron/{{patron().id()}}/message_center">
195               [% l('Message Center') %]
196             </a>
197           </li>
198           <li>
199             <a href="./circ/patron/{{patron().id()}}/stat_cats">
200               [% l('Statistical Categories') %]
201             </a>
202           </li>
203           <li>
204             <a href="./circ/patron/{{patron().id()}}/hold_subscriptions">
205               [% l('Hold Groups') %]
206             </a>
207           </li>
208           <li>
209             <a href="./circ/patron/{{patron().id()}}/surveys">
210               [% l('Surveys') %]
211             </a>
212           </li>
213           <li>
214             <a href="./circ/patron/{{patron().id()}}/group">
215               [% l('Group Member Details') %]
216             </a>
217           </li>
218           <li>
219             <a href="./circ/patron/{{patron().id()}}/edit_perms">
220               [% l('User Permission Editor') %]
221             </a>
222           </li>
223           <li>
224             <a href="./circ/patron/{{patron().id()}}/credentials">
225               [% l('Test Password') %]
226             </a>
227           </li>
228           <li>
229             <a href="./acq/requests/user/{{patron().id()}}" target="_top">
230               [% l('Acquisition Patron Requests') %]
231             </a>
232           </li>
233           <li>
234             <a href="/eg2/staff/booking/manage_reservations/by_patron/{{patron().id()}}" target="_top">
235               [% l('Booking: Manage Reservations') %]
236             </a>
237           </li>
238           <li>
239             <a href="/eg2/staff/booking/create_reservation/for_patron/{{patron().id()}}" target="_top">
240               [% l('Booking: Create Reservation') %]
241             </a>
242           </li>
243           <li>
244             <a href="/eg2/staff/booking/pickup/by_patron/{{patron().id()}}" target="_top">
245               [% l('Booking: Pick Up Reservations') %]
246             </a>
247           </li>
248           <li>
249             <a href="/eg2/staff/booking/return/by_patron/{{patron().id()}}" target="_top">
250               [% l('Booking: Return Reservations') %]
251             </a>
252           </li>
253           <li>
254             <a href ng-click="purge_account()" a-disabled="patron().super_user() == 't' || patron().id() == auth_user_id">
255               [% l('Completely Purge Account') %]
256             </a>
257           </li>
258        </ul>
259       </li>
260       <li ng-class="{active : tab == 'search'}" class="pull-right">
261         <a href="./circ/patron/search">[% l('Patron Search') %]</a>
262       </li>
263     </ul>
264     <div class="flex-row patron-reg-actions-bar" ng-if="is_patron_edit()">
265       [% INCLUDE 'staff/circ/patron/reg_actions.tt2' %]
266     </div>
267
268   </div><!-- col -->
269 </div><!-- row -->
270
271 <div class="row">
272   <div class="col-md-3" ng-hide="collapse_summary()">
273     [% INCLUDE 'staff/circ/patron/t_summary.tt2' %]
274   </div>
275   <div ng-class="{'col-md-12' : collapse_summary(),'col-md-9' : !collapse_summary()}">
276     <div class="tab-content">
277       <div class="tab-pane active">
278         <div ng-view></div>
279       </div>
280     </div>
281   </div><!-- col -->
282 </div><!-- row -->
283
284 [% END %]