2 WRAPPER "staff/base.tt2";
3 ctx.page_title = l("Patron");
4 ctx.page_app = "egPatronApp";
5 ctx.page_ctrl = "PatronCtrl";
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/circ/services/patrons.js"></script>
15 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/billing.js"></script>
16 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/circ.js"></script>
17 [% INCLUDE 'staff/circ/share/circ_strings.tt2' %]
18 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/holds.js"></script>
19 [% INCLUDE 'staff/circ/share/hold_strings.tt2' %]
20 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/record.js"></script>
21 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/app.js"></script>
22 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/regctl.js"></script>
24 <!-- load the rest on demand? -->
26 <!-- required for credentials verify API -->
27 <script src="[% ctx.media_prefix %]/js/dojo/opensrf/md5.js"></script>
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>
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" />
39 angular.module('egCoreMod').run(['egStrings', function(s) {
40 s.ANNOTATE_PAYMENT_MSG = "[% l('Please annotate this payment') %]";
41 s.CONFIRM_REFUND_PAYMENT =
42 "[% |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 %]";
43 s.EDIT_BILL_PAY_NOTE = "[% l('Enter new note for #[_1]:','{{ids}}') %]";
44 s.GROUP_ADD_USER = "[% l('Enter the patron barcode') %]";
45 s.RENEW_ITEMS = "[% l('Renew Items?') %]";
46 s.RENEW_ALL_ITEMS = "[% l('Renew All Items?') %]";
47 s.CHECK_IN_CONFIRM = "[% l('Check In Items?') %]";
48 s.REG_INVALID_FIELDS =
49 "[% l('Please enter valid values for all required fields.') %]"
50 s.PAYMENT_WARN_AMOUNT = "[% l('Are you sure you want to apply a payment of $[_1]?', '{{payment_amount}}') %]";
51 s.PAYMENT_WARN_AMOUNT_TITLE = "[% l('Verify Payment Amount') %]";
52 s.PAYMENT_OVER_MAX = "[% l('Payments over $[_1] are denied by policy.', '{{max_amount}}') %]";
56 <!-- add room for the fixed navigation elements -->
57 <style ng-if="is_patron_edit">
58 #top-content-container { padding-top: 120px; }
60 <style ng-if="!is_patron_edit">
61 #top-content-container { padding-top: 80px; }
66 <div class="row" id="patron-fixed-tabs">
67 <div class="col-md-3 patron-name-header">
68 <div ng-show="patron()">
69 <h4 title="{{patron().id()}}">
70 <div class="flex-row">
71 <div class="flex-cell"
72 ng-class="{'patron-summary-alert' : hasAlerts()}">
73 [% l('[_1], [_2] [_3]',
74 '{{patron().family_name()}}',
75 '{{patron().first_given_name()}}',
76 '{{patron().second_given_name()}}') %]
78 <div ng-show="tab != 'search'">
79 <a href ng-click="toggle_expand_summary()"
80 title="[% l('Collapse Patron Summary Display') %]"
81 ng-hide="collapse_summary()">
82 <span class="glyphicon glyphicon-resize-small"></span>
84 <a href ng-click="toggle_expand_summary()"
85 title="[% l('Expand Patron Summary Display') %]"
86 ng-show="collapse_summary()">
87 <span class="glyphicon glyphicon-resize-full"></span>
95 <div class="col-md-9">
96 <ul class="nav nav-pills nav-pills-like-tabs">
97 <li ng-class="{active : tab == 'checkout', disabled : !patron()}">
98 <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/checkout">[% l('Check Out') %]</a>
100 <li ng-class="{active : tab == 'items_out', disabled : !patron()}">
101 <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/items_out">
103 <span ng-if="patron()"><!-- lack of space / newline below intentional -->
104 (<span ng-class="{'patron-summary-alert-small' : patron_stats().checkouts.overdue}">{{patron_stats().checkouts.total_out}}</span>)
108 <li ng-class="{active : tab == 'holds', disabled : !patron()}">
109 <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/holds">
111 <span ng-if="patron()">
112 (<span>{{patron_stats().holds.ready}} / {{patron_stats().holds.total}}</span>)
116 <li ng-class="{active : tab == 'bills', disabled : !patron()}">
117 <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/bills">
119 <span ng-if="patron()">
120 (<span ng-class="{'patron-summary-alert-small' : patron_stats().fines.balance_owed}">{{patron_stats().fines.balance_owed | currency}}</span>)
124 <li ng-class="{active : tab == 'messages', disabled : !patron()}">
125 <a a-disabled="!patron()" href="./circ/patron/{{patron().id()}}/messages">[% l('Messages') %]</a>
127 <li ng-class="{active : tab == 'edit', disabled : !patron()}">
128 <a href="./circ/patron/{{patron().id()}}/edit">[% l('Edit') %]</a>
130 <li uib-dropdown ng-class="{active : tab == 'other', disabled : !patron()}">
131 <a a-disabled="!patron()" href uib-dropdown-toggle>
133 <b class="caret"></b>
135 <ul uib-dropdown-menu>
137 <a href="./circ/patron/{{patron().id()}}/alerts">
138 [% l('Display Alert and Messages') %]
142 <a href="./circ/patron/{{patron().id()}}/notes">
147 <a href="./circ/patron/{{patron().id()}}/triggered_events">
148 [% l('Triggered Events / Notifications') %]
152 <a href="./circ/patron/{{patron().id()}}/stat_cats">
153 [% l('Statistical Categories') %]
157 <a href="./circ/patron/{{patron().id()}}/group">
158 [% l('Group Member Details') %]
162 <a href="./circ/patron/{{patron().id()}}/edit_perms">
163 [% l('User Permission Editor') %]
167 <a href="./circ/patron/{{patron().id()}}/credentials">
168 [% l('Test Password') %]
173 <li ng-class="{active : tab == 'search'}" class="pull-right">
174 <a href="./circ/patron/search">[% l('Patron Search') %]</a>
177 <div class="flex-row patron-reg-actions-bar" ng-if="is_patron_edit()">
178 [% INCLUDE 'staff/circ/patron/reg_actions.tt2' %]
185 <div class="col-md-3" ng-hide="collapse_summary()">
186 [% INCLUDE 'staff/circ/patron/t_summary.tt2' %]
188 <div ng-class="{'col-md-12' : collapse_summary(),'col-md-9' : !collapse_summary()}">
189 <div class="tab-content">
190 <div class="tab-pane active">