]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/templates/staff/offline-interface.tt2
LP#1706107: Offline mode
[working/Evergreen.git] / Open-ILS / src / templates / staff / offline-interface.tt2
1 [%
2   WRAPPER "staff/base.tt2";
3   ctx.page_title = l("Offline"); 
4   ctx.page_app = "egOffline";
5 %]
6
7
8 <script type="text/ng-template" id="offline-template">
9
10 <div class="row">
11   <div class="col-md-12">
12     <div class="input-group">
13       <div class="input-group-addon"><b>[% l('Workstation') %]</b></div>
14       <div class="input-group-addon">
15         <select class="form-control" required
16           ng-model="workstation"
17           ng-options="ws.id as ws.name for ws in workstations"></select>
18       </div>
19       <div class="input-group-addon"><b>[% l('Working location') %]</b></div>
20       <div class="input-group-addon">
21         <eg-org-selector sticky-setting="eg.org.offline_location" selected="org"></eg-org-selector>
22       </div>
23       <div class="input-group-addon">
24         <button
25           class="btn btn-primary"
26           ng-disabled="all_xact.length == 0 || active_tab == 'register'"
27           ng-click="save()">
28             [% l('Save Transactions') %]
29         </button>
30         <button
31           class="btn btn-default"
32           ng-disabled="!printed"
33           ng-click="reprintLast()">
34             [% l('Reprint Last Receipt') %]
35         </button>
36         <button
37           class="btn btn-default"
38           ng-if="logged_in"
39           ng-click="downloadBlockList()">
40             [% l('Download block list') %]
41         </button>
42         <button
43           class="btn btn-default"
44           ng-disabled="pending_xacts.length == 0"
45           eg-line-exporter
46           ng-if="!logged_in"
47           default-file-name="pending.xacts"
48           json-array="pending_xacts"
49         >[% l('Export Transactions') %]</button>
50       </div>
51     </div>
52   </div>
53 </div>
54
55 <div class="row col-md-offset-3 col-md-6 pad-vert">
56   <div ng-show="logged_in && active_tab != 'session'" class="alert alert-danger">
57     <h2>[% l('Warning') %]</h2>
58     [% l('You are about to enter offline mode. If you proceed, you will be logged out.') %]
59     <br/>
60     <br/>
61     <button class="btn btn-danger" ng-click="logout()">[% l('Proceed') %]</button>
62   </div>
63 </div>
64
65 <div class="row col-md-12 pad-vert">
66   <div class="col-md-12">
67     <uib-tabset active="active_tab">
68       <!-- note that non-numeric index values must be enclosed in single-quotes,
69            otherwise selecting the active table won't work cleanly -->
70       <uib-tab index="'checkout'" heading="[% l('Checkout') %]">
71
72         <div class="row">
73
74           <!-- left-hand side -->
75           <div class="col-md-6" style="border-right:solid 1px;">
76             <div class="row">
77               <div class="col-md-1"></div>
78               <div class="col-md-4">
79                 [% l('Due Date:') %]
80               </div>
81               <div class="col-md-4">
82                 <eg-date-input id="co_duedate" ng-model="shared.due_date" out-of-range="shared.outOfRange" min-date="minDate"></eg-date-input>
83               </div>
84               <div class="col-md-3">
85                 <select class="form-control" ng-model="shared.due_date_offset" ng-change="resetDueDate()">
86                   <option value="">[% l('No Offset') %]</option>
87                   <option value="3">[% l('Today + 3 days') %]</option>
88                   <option value="7">[% l('Today + 7 days') %]</option>
89                   <option value="14">[% l('Today + 14 days') %]</option>
90                   <option value="30">[% l('Today + 30 days') %]</option>
91                 </select>
92               </div>
93             </div>
94
95             <div class="row pad-vert">
96               <div class="col-md-1"></div>
97               <div class="col-md-4">
98                 [% l('Patron barcode:') %]
99               </div>
100               <div class="col-md-7">
101                 <input class="form-control" type="text" ng-model="checkout.patron_barcode" next-on-enter="co_barcode"/>
102               </div>
103             </div>
104
105             <div class="row pad-vert">
106               <div class="col-md-1">
107                 <input type="radio" ng-model="barcode_type" value="barcode" id="bc_radio"/>
108               </div>
109               <div class="col-md-4">
110                 <label style="font-weight:normal !important;" for="bc_radio">[% l('Item Barcode:') %]</label>
111               </div>
112               <div class="col-md-7">
113                 <input id="co_barcode"
114                     class="form-control"
115                     ng-init="barcode_type = 'barcode'"
116                     ng-disabled="barcode_type != 'barcode'"
117                     type="text"
118                     ng-model="checkout.barcode"
119                     eg-enter="!notEnough('checkout') && add('checkout')"
120                 />
121               </div>
122             </div>
123
124             <div class="row">
125               <div class="col-md-1">
126                 <input type="radio" ng-model="barcode_type" value="noncat" id="nc_radio"/>
127               </div>
128               <div class="col-md-4">
129                 <label style="font-weight:normal !important;" for="nc_radio">[% l('Non-cataloged Type:') %]</label>
130               </div>
131               <div class="col-md-5">
132                 <select
133                     class="form-control"
134                     ng-disabled="barcode_type != 'noncat'"
135                     ng-options="nct.id() as nct.name() for nct in noncats"
136                     ng-model="checkout.noncat_type"
137                 >
138                   <option value="">[% l('Select Non-cataloged Type') %]</option>
139                 </select>
140               </div>
141               <div class="col-md-2">
142                 <input
143                     class="form-control"
144                     ng-disabled="barcode_type != 'noncat'"
145                     type="number"
146                     min="1"
147                     max="100"
148                     ng-model="checkout.noncat_count"
149                 />
150               </div>
151             </div>
152
153             <div class="row pad-vert">
154               <div class="col-md-2">
155                 <button class="btn btn-warning" ng-click="clear('checkout')">[% l('Clear') %]</button>
156               </div>
157               <div class="col-md-4">
158                 <input id="do_check_co" type="checkbox" ng-model="strict_barcode" ng-click="changeCheck()"></input>
159                 <label for="do_check_co">[% l('Strict Barcode') %]</label>
160               </div>
161               <div class="col-md-6">
162                 <input id="do_print_co" type="checkbox" ng-model="do_print" ng-click="changePrint()"></input>
163                 <label for="do_print_co">[% l('Print receipt') %]</label>
164                 <button class="btn btn-primary pull-right" ng-disabled="notEnough('checkout')" ng-click="add('checkout','co_barcode')">[% l('Checkout') %]</button>
165               </div>
166             </div>
167
168           </div>
169
170           <!-- right-hand side -->
171           <div class="col-md-6 container">
172             <table class="table">
173               <thead>
174                 <tr>
175                   <th>[% l('Patron barcode') %]</th>
176                   <th>[% l('Item barcode') %]</th>
177                   <th>[% l('Due date') %]</th>
178                 </tr>
179               </thead>
180               <tbody>
181                 <tr ng-repeat="xact in xact_page.checkout track by $index">
182                   <td>{{xact.patron_barcode}}</td>
183                   <td>{{xact.barcode}}</td>
184                   <td>{{xact.due_date | date:'shortDate'}}</td>
185                 </tr>
186               </tbody>
187             </table>
188           </div>
189
190         </div>
191
192       </uib-tab>
193       <uib-tab index="'renew'" heading="[% l('Renew') %]">
194
195         <div class="row">
196
197           <!-- left-hand side -->
198           <div class="col-md-6" style="border-right:solid 1px;">
199             <div class="row">
200               <div class="col-md-1"></div>
201               <div class="col-md-4">
202                 [% l('Due Date:') %]
203               </div>
204               <div class="col-md-4">
205                 <eg-date-input ng-model="shared.due_date" out-of-range="shared.outOfRange" min-date="minDate"></eg-date-input>
206               </div>
207               <div class="col-md-3">
208                 <select class="form-control" ng-model="shared.due_date_offset" ng-change="resetDueDate()">
209                   <option value="">[% l('No Offset') %]</option>
210                   <option value="3">[% l('Today + 3 days') %]</option>
211                   <option value="7">[% l('Today + 7 days') %]</option>
212                   <option value="14">[% l('Today + 14 days') %]</option>
213                   <option value="30">[% l('Today + 30 days') %]</option>
214                 </select>
215               </div>
216             </div>
217
218             <div class="row pad-vert">
219               <div class="col-md-1"></div>
220               <div class="col-md-4">
221                 [% l('Patron barcode:') %]
222               </div>
223               <div class="col-md-7">
224                 <input class="form-control" type="text" ng-model="renew.patron_barcode" next-on-enter="re_barcode"/>
225               </div>
226             </div>
227
228             <div class="row pad-vert">
229               <div class="col-md-1"></div>
230               <div class="col-md-4">
231                 [% l('Item Barcode:') %]
232               </div>
233               <div class="col-md-7">
234                 <input class="form-control" type="text" ng-model="renew.barcode" id="re_barcode" eg-enter="!notEnough('renew') && add('renew')"/>
235               </div>
236             </div>
237
238             <div class="row pad-vert">
239               <div class="col-md-2">
240                 <button class="btn btn-warning" ng-click="clear('renew')">[% l('Clear') %]</button>
241               </div>
242               <div class="col-md-4">
243                 <input id="do_check_r" type="checkbox" ng-model="strict_barcode" ng-click="changeCheck()"></input>
244                 <label for="do_check_r">[% l('Strict Barcode') %]</label>
245               </div>
246               <div class="col-md-6">
247                 <input id="do_print_r" type="checkbox" ng-model="do_print" ng-click="changePrint()"></input>
248                 <label for="do_print_r">[% l('Print receipt') %]</label>
249                 <button class="btn btn-primary pull-right" ng-disabled="notEnough('renew')" ng-click="add('renew','re_barcode')">[% l('Renew') %]</button>
250               </div>
251             </div>
252
253           </div>
254
255           <!-- right-hand side -->
256           <div class="col-md-6 container">
257             <table class="table">
258               <thead>
259                 <tr>
260                   <th>[% l('Patron barcode') %]</th>
261                   <th>[% l('Item barcode') %]</th>
262                   <th>[% l('Due date') %]</th>
263                 </tr>
264               </thead>
265               <tbody>
266                 <tr ng-repeat="xact in xact_page.renew track by $index">
267                   <td>{{xact.patron_barcode}}</td>
268                   <td>{{xact.barcode}}</td>
269                   <td>{{xact.due_date | date:'shortDate'}}</td>
270                 </tr>
271               </tbody>
272             </table>
273           </div>
274
275         </div>
276
277       </uib-tab>
278       <uib-tab index="'in_house_use'" heading="[% l('In-house Use') %]">
279
280         <div class="row">
281
282           <!-- left-hand side -->
283           <div class="col-md-6 container" style="border-right:solid 1px;">
284
285             <div class="row">
286               <div class="col-md-1"></div>
287               <div class="col-md-5">
288                 [% l('Use count:') %]
289               </div>
290               <div class="col-md-6">
291                 <input class="form-control" type="number" min="1" max="100" next-on-enter="ihu_barcode" ng-model="in_house_use.count"/>
292               </div>
293             </div>
294
295             <div class="row pad-vert">
296               <div class="col-md-1"></div>
297               <div class="col-md-5">
298                 [% l('Item Barcode:') %]
299               </div>
300               <div class="col-md-6">
301                 <input class="form-control" type="text" ng-model="in_house_use.barcode" eg-enter="add('in_house_use')" id="ihu_barcode"/>
302               </div>
303             </div>
304
305             <div class="row pad-vert">
306               <div class="col-md-2">
307                 <button class="btn btn-warning" ng-click="clear('in_house_use')">[% l('Clear') %]</button>
308               </div>
309               <div class="col-md-4">
310                 <input id="do_check_ihu" type="checkbox" ng-model="strict_barcode" ng-click="changeCheck()"></input>
311                 <label for="do_check_ihu">[% l('Strict Barcode') %]</label>
312               </div>
313               <div class="col-md-6">
314                 <input id="do_print_ihu" type="checkbox" ng-model="do_print" ng-click="changePrint()"></input>
315                 <label for="do_print_ihu">[% l('Print receipt') %]</label>
316                 <button class="btn btn-primary pull-right" ng-disabled="notEnough('in_house_use')" ng-click="add('in_house_use','ihu_barcode')">[% l('Record Use') %]</button>
317               </div>
318             </div>
319
320           </div>
321
322           <!-- right-hand side -->
323           <div class="col-md-6 container">
324             <table class="table">
325               <thead>
326                 <tr>
327                   <th>[% l('Item barcode') %]</th>
328                   <th>[% l('Use count') %]</th>
329                 </tr>
330               </thead>
331               <tbody>
332                 <tr ng-repeat="xact in xact_page.in_house_use track by $index">
333                   <td>{{xact.barcode}}</td>
334                   <td>{{xact.count}}</td>
335                 </tr>
336               </tbody>
337             </table>
338           </div>
339
340         </div>
341
342       </uib-tab>
343       <uib-tab index="'checkin'" heading="[% l('Checkin') %]">
344
345         <div class="row">
346
347           <!-- left-hand side -->
348           <div class="col-md-6" style="border-right:solid 1px;">
349
350             <div class="row">
351               <div class="col-md-1"></div>
352               <div class="col-md-5">
353                 [% l('Checkin Date:') %]
354               </div>
355               <div class="col-md-6">
356                 <eg-date-input ng-model="checkin.backdate"></eg-date-input>
357               </div>
358             </div>
359
360             <div class="row pad-vert">
361               <div class="col-md-1"></div>
362               <div class="col-md-5">
363                 [% l('Item Barcode:') %]
364               </div>
365               <div class="col-md-6">
366                 <input id="ci_barcode" class="form-control" type="text" ng-model="checkin.barcode" eg-enter="!notEnough('checkin') && add('checkin')"/>
367               </div>
368             </div>
369
370             <div class="row pad-vert">
371               <div class="col-md-2">
372                 <button class="btn btn-warning" ng-click="clear('checkin')">[% l('Clear') %]</button>
373               </div>
374               <div class="col-md-4">
375                 <input id="do_check_ci" type="checkbox" ng-model="strict_barcode" ng-click="changeCheck()"></input>
376                 <label for="do_check_ci">[% l('Strict Barcode') %]</label>
377               </div>
378               <div class="col-md-6">
379                 <input id="do_print_ci" type="checkbox" ng-model="do_print" ng-click="changePrint()"></input>
380                 <label for="do_print_ci">[% l('Print receipt') %]</label>
381                 <button class="btn btn-primary pull-right" ng-disabled="notEnough('checkin')" ng-click="add('checkin','ci_barcode')">[% l('Checkin') %]</button>
382                     
383               </div>
384             </div>
385
386           </div>
387
388           <!-- right-hand side -->
389           <div class="col-md-6 container">
390             <table class="table">
391               <thead>
392                 <tr>
393                   <th>[% l('Item barcode') %]</th>
394                   <th>[% l('Effective Checkin date') %]</th>
395                 </tr>
396               </thead>
397               <tbody>
398                 <tr ng-repeat="xact in xact_page.checkin track by $index">
399                   <td>{{xact.barcode}}</td>
400                   <td>{{xact.backdate | date:'shortDate'}}</td>
401                 </tr>
402               </tbody>
403             </table>
404           </div>
405
406         </div>
407
408       </uib-tab>
409       <uib-tab index="'register'" heading="[% l('Register Patron') %]">
410         <div ng-controller="PatronRegCtrl">
411           <div>[% INCLUDE 'staff/circ/patron/t_edit.tt2' %]</div>
412         </div>
413       </uib-tab>
414       <uib-tab ng-if="logged_in" index="'session'" heading="[% l('Session Management') %]">
415         <div class="col-md-12" ng-controller="OfflineSessionCtrl">
416           <uib-tabset active="active_session_tab">
417             <uib-tab index="'pending'" heading="[% l('Pending Transactions') %]">
418               <div class="row">
419                 <div class="col-md-12 container">
420                   <button
421                     class="btn btn-default"
422                     ng-disabled="pending_xacts.length == 0"
423                     eg-line-exporter
424                     default-file-name="pending.xacts"
425                     json-array="pending_xacts"
426                   >[% l('Export Transactions') %]</button>
427                   <div class="btn-group">
428                     <span class="btn btn-default btn-file">
429                       [% l('Import Transactions') %]
430                       <input type="file" eg-file-reader container="imported_pending_xacts.data">
431                     </span>
432                   </div>
433                 <button class="btn btn-warning pull-right" ng-click="clear_pending()">[% l('Clear Transactions') %]</button>
434                 </div>
435               </div>
436               <div class="row">
437                 <div class="col-md-12 container">
438                   <table class="table">
439                     <thead>
440                       <tr>
441                         <th>[% l('Type') %]</th>
442                         <th>[% l('Timestamp') %]</th>
443                         <th>[% l('Patron Barcode') %]</th>
444                         <th>[% l('Item Barcode') %]</th>
445                         <th>[% l('Non-cataloged Type') %]</th>
446                         <th>[% l('Checkout Date') %]</th>
447                         <th>[% l('Due Date') %]</th>
448                         <th>[% l('Checkin Date') %]</th>
449                         <th>[% l('First Name') %]</th>
450                         <th>[% l('Last Name') %]</th>
451                       </tr>
452                     </thead>
453                     <tbody>
454                       <tr ng-repeat="xact in pending_xacts track by $index">
455                         <td>{{xact.type}}</td>
456                         <td>{{createDate(xact.timestamp, true) | date:'short'}}</td>
457                         <td>{{xact.patron_barcode || xact.user.card.barcode}}</td>
458                         <td>{{xact.barcode}}</td>
459                         <td>{{lookupNoncatTypeName(xact.noncat_type)}}</td>
460                         <td>{{createDate(xact.checkout_time) | date:'short'}}</td>
461                         <td>{{createDate(xact.due_date) | date:'shortDate'}}</td>
462                         <td>{{createDate(xact.backdate) | date:'shortDate'}}</td>
463                         <td>{{xact.user.first_given_name}}</td>
464                         <td>{{xact.user.family_name}}</td>
465                       </tr>
466                     </tbody>
467                   </table>
468                 </div>
469               </div>
470             </uib-tab>
471             <uib-tab index="'offline_sessions'" heading="[% l('Offline Sessions') %]">
472               <div class="row">
473                 <div class="col-md-12">
474                   <button
475                     class="btn btn-primary"
476                     ng-disabled="!logged_in"
477                     ng-click="createSession()">[% l('Create Session') %]</button>
478                   <button
479                     class="btn btn-default pull-right"
480                     ng-disabled="!logged_in"
481                     ng-click="refreshSessions()">[% l('Refresh') %]</button>
482                 </div>
483               </div>
484               <div class="row">
485                 <div class="col-md-12"><h2>[% l('Session List') %]</h2></div>
486               </div>
487               <div class="row">
488                 <div class="col-md-12">
489                   <table class="table" ts-wrapper>
490                     <thead>
491                       <tr>
492                         <th ts-criteria="org">[% l('Organization') %]</th>
493                         <th ts-criteria="creator">[% l('Created By') %]</th>
494                         <th ts-criteria="description">[% l('Description') %]</th>
495                         <th ts-criteria="create_time|parseInt" ts-default="descending">[% l('Date Created') %]</th>
496                         <th>[% l('Upload Count') %]</th>
497                         <th>[% l('Transactions Processed') %]</th>
498                         <th ts-criteria="end_time|parseInt">[% l('Date Completed') %]</th>
499                         <th></th>
500                       </tr>
501                     </thead>
502                     <tbody>
503                       <tr ts-repeat
504                         ng-repeat="ses in sessions track by $index"
505                         ng-click="setSession(ses, $index)"
506                         ng-class="{'bg-info':current_session_index==$index}"
507                       >
508                         <td>{{ses.org}}</td>
509                         <td>{{ses.creator}}</td>
510                         <td>{{ses.description}}</td>
511                         <td>{{createDate(ses.create_time, true) | date:'short'}}</td>
512                         <td>{{ses.total}}</td>
513                         <td>{{ses.num_complete}}</td>
514                         <td>{{createDate(ses.end_time, true) | date:'short'}}</td>
515                         <td>
516                           <button
517                             class="btn btn-info btn-xs"
518                             ng-disabled="!logged_in || pending_xacts.length == 0 || ses.end_time"
519                             ng-click="uploadPending(ses, $index)"
520                           >[% l('Upload') %]</button>
521                           <button
522                             class="btn btn-warning btn-xs"
523                             ng-disabled="!logged_in || ses.total == 0 || ses.end_time"
524                             ng-click="processSession(ses, $index)"
525                           >[% l('Process') %]</button>
526                         </td>
527                       </tr>
528                     </tbody>
529                   </table>
530                 </div>
531               </div>
532               <div class="row">
533                     <div class="col-md-12"><hr/></div>
534               </div>
535               <div class="row">
536                     <div class="col-md-12"><h2>[% l('Exception List') %]</h2></div>
537               </div>
538               <div class="row">
539                 <div class="col-md-12">
540                   <table class="table">
541                     <thead>
542                       <tr>
543                         <th>[% l('Workstation') %]</th>
544                         <th>[% l('Type') %]</th>
545                         <th>[% l('Timestamp') %]</th>
546                         <th>[% l('Event Name') %]</th>
547                         <th>[% l('Patron Barcode') %]</th>
548                         <th>[% l('Item Barcode') %]</th>
549                         <th>[% l('Non-cataloged Type') %]</th>
550                         <th>[% l('Checkout Date') %]</th>
551                         <th>[% l('Due Date') %]</th>
552                         <th>[% l('Checkin Date') %]</th>
553                         <th></th>
554                       </tr>
555                     </thead>
556                     <tbody>
557                       <tr ng-repeat="xact in current_session.exceptions track by $index">
558                         <td>{{xact.command._workstation}}</td>
559                         <td>{{xact.command.type}}</td>
560                         <td>{{createDate(xact.command.timestamp, true) | date:'short'}}</td>
561                         <td>{{xact.event.textcode}}</td>
562                         <td>{{xact.command.patron_barcode || xact.command.user.card.barcode}}</td>
563                         <td>{{xact.command.barcode}}</td>
564                         <td>{{lookupNoncatTypeName(xact.command.noncat_type)}}</td>
565                         <td>{{createDate(xact.command.checkout_time) | date:'short'}}</td>
566                         <td>{{createDate(xact.command.due_date) | date:'shortDate'}}</td>
567                         <td>{{createDate(xact.command.backdate) | date:'shortDate'}}</td>
568                         <td>
569                           <button
570                             class="btn btn-info btn-xs"
571                             ng-disabled="!logged_in || !xact.command.barcode"
572                             ng-click="retrieveItem(xact.command.barcode)">[% l('Item') %]</button>
573                           <button
574                             class="btn btn-info btn-xs"
575                             ng-disabled="!logged_in || (!xact.command.patron_barcode && xact.command.user.card.barcode)"
576                             ng-click="retrievePatron(xact.command.patron_barcode)">[% l('Patron') %]</button>
577                           <button
578                             class="btn btn-info btn-xs"
579                             ng-disabled="!logged_in"
580                             ng-click="retrieveDetails(xact)">[% l('Debug') %]</button>
581                         </td>
582                       </tr>
583                     </tbody>
584                   </table>
585                 </div>
586               </div>
587             </uib-tab>
588           </uib-tabset>
589         </div>
590       </uib-tab>
591     </uib-tabset>
592   </div>
593 </div>
594
595 </script>
596
597 [% BLOCK APP_JS %]
598 <!-- offline page app -->
599 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/file.js"></script>
600 <script src="[% ctx.media_prefix %]/js/ui/default/staff/offline.js"></script>
601 <script src="[% ctx.media_prefix %]/js/ui/default/staff/build/js/angular-tablesort.js"></script>
602 <script>
603 angular.module('egCoreMod').run(['egStrings', function(s) {
604   s.OFFLINE_BLOCKLIST_SUCCESS = "[% l('Offline blocklist downloaded') %]";
605   s.OFFLINE_BLOCKLIST_FAIL = "[% l('Error downloading offline blocklist') %]";
606   s.DUPLICATE_BARCODE = "[% l('Duplicate item barcode') %]";
607
608   s.ALLOW = "[% l('Allow') %]";
609   s.REJECT = "[% l('Reject') %]";
610
611   s.REG_ADDR_TYPE = "[% l('Mailing') %]";
612   s.REG_INVALID_FIELDS =
613     "[% l('Please enter valid values for all required fields.') %]"
614   s.REG_ADDR_REQUIRED =
615     "[% l('An address is required during registration.') %]"
616
617   s.PATRON_BLOCKED_WHY = {};
618   s.PATRON_BLOCKED_WHY.D = "[% l('Patron has penalties') %]";
619   s.PATRON_BLOCKED_WHY.L = "[% l('Barcode is reported Lost') %]";
620   s.PATRON_BLOCKED_WHY.E = "[% l('Patron account is Expired') %]";
621   s.PATRON_BLOCKED_WHY.B = "[% l('Patron account is Barred') %]";
622
623 }]);
624 </script>
625 <link rel="stylesheet" href="[% ctx.base_path %]/staff/css/circ.css" />
626 <link rel="stylesheet" href="[% ctx.media_prefix %]/js/ui/default/staff/build/css/tablesort.css" />
627 [% END %]
628
629 <div ng-view></div> 
630
631 [% END %]
632