e2345cec51f1e0bed264b9d7ec2b75f9b28fefca
[koha.git] / patron_search.tt
1 [% USE Koha %]
2 [% USE Branches %]
3 [% SET footerjs = 1 %]
4 [% INCLUDE 'doc-head-open.inc' %]
5 <title>Koha &rsaquo; Patron search</title>
6 [% INCLUDE 'doc-head-close.inc' %]
7 <link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/datatables_[% KOHA_VERSION %].css" />
8 </head>
9
10 <body id="common_patron_search" class="common">
11 <div id="patron_search" class="yui-t7">
12   <div id="bd">
13     <div class="yui-g">
14
15         <form id="searchform">
16             <fieldset class="brief">
17                 <h3>Search for patron</h3>
18                 <ol>
19                     <li>
20                         <label for="searchmember_filter">Search:</label>
21                         <input type="text" id="searchmember_filter" value="[% searchmember %]"/>
22                     </li>
23                     <li>
24                         <label for="categorycode_filter">Category:</label>
25                         <select id="categorycode_filter">
26                             <option value="">Any</option>
27                             [% FOREACH category IN categories %]
28                                 <option value="[% category.categorycode %]">[% category.description %]</option>
29                             [% END %]
30                         </select>
31                     </li>
32                     <li>
33                         <label for="branchcode_filter">Library:</label>
34                         <select id="branchcode_filter">
35                             [% SET libraries = Branches.all( only_from_group => 1 ) %]
36                             [% IF libraries.size != 1 %]
37                                 <option value="">Any</option>
38                             [% END %]
39                             [% FOREACH l IN libraries %]
40                                 <option value="[% l.branchcode %]">[% l.branchname %]</option>
41                             [% END %]
42                         </select>
43                     </li>
44                 </ol>
45                 <fieldset class="action">
46                     <input type="submit" value="Search" />
47                 </fieldset>
48             </fieldset>
49         </form>
50
51         [% IF patrons_with_acq_perm_only %]
52             <div class="hint">Only staff with superlibrarian or acquisitions permissions (or order_manage permission if granular permissions are enabled) are returned in the search results</div>
53         [% END %]
54
55         <div class="browse">
56             Browse by last name:
57             [% FOREACH letter IN alphabet.split(' ') %]
58                 <a href="#" class="filterByLetter">[% letter %]</a>
59             [% END %]
60         </div>
61
62         <div id="info" class="dialog message"></div>
63         <div id="error" class="dialog alert"></div>
64
65         <input type="hidden" id="firstletter_filter" value="" />
66         <div id="searchresults">
67             <table id="memberresultst">
68                 <thead>
69                     <tr>
70                         [% FOR column IN columns %]
71                             [% SWITCH column %]
72                                 [% CASE 'cardnumber' %]<th>Card</th>
73                                 [% CASE 'dateofbirth' %]<th>Date of birth</th>
74                                 [% CASE 'address' %]<th>Address</th>
75                                 [% CASE 'name' %]<th>Name</th>
76                                 [% CASE 'branch' %]<th>Library</th>
77                                 [% CASE 'category' %]<th>Category</th>
78                                 [% CASE 'dateexpiry' %]<th>Expires on</td>
79                                 [% CASE 'borrowernotes' %]<th>Notes</th>
80                                 [% CASE 'action' %]<th>&nbsp;</th>
81                             [% END %]
82                         [% END %]
83                     </tr>
84                   </thead>
85                 <tbody></tbody>
86             </table>
87         </div>
88
89 <div id="closewindow"><a href="#" class="btn btn-default btn-default close">Close</a></div>
90 </div>
91 </div>
92
93 [% MACRO jsinclude BLOCK %]
94     [% INCLUDE 'datatables.inc' %]
95
96     <script type="text/javascript">
97         var search = 1;
98         $(document).ready(function(){
99             $("#info").hide();
100             $("#error").hide();
101
102             [% IF view != "show_results" %]
103                 $("#searchresults").hide();
104                 search = 0;
105             [% END %]
106
107             // Apply DataTables on the results table
108             dtMemberResults = $("#memberresultst").dataTable($.extend(true, {}, dataTablesDefaults, {
109                 'bServerSide': true,
110                 'sAjaxSource': "/cgi-bin/koha/svc/members/search",
111                 'fnServerData': function(sSource, aoData, fnCallback) {
112                     if ( ! search ) {
113                         return;
114                     }
115                     aoData.push({
116                         'name': 'searchmember',
117                         'value': $("#searchmember_filter").val()
118                     },{
119                         'name': 'firstletter',
120                         'value': $("#firstletter_filter").val()
121                     },{
122                         'name': 'categorycode',
123                         'value': $("#categorycode_filter").val()
124                     },{
125                         'name': 'branchcode',
126                         'value': $("#branchcode_filter").val()
127                     },{
128                         'name': 'name_sorton',
129                         'value': 'borrowers.surname borrowers.firstname'
130                     },{
131                         'name': 'category_sorton',
132                         'value': 'categories.description',
133                     },{
134                         'name': 'branch_sorton',
135                         'value': 'branches.branchname'
136                     },{
137                         'name': 'template_path',
138                         'value': '[% json_template %]',
139                     },{
140                         'name': 'selection_type',
141                         'value': '[% selection_type %]',
142                     }
143                     [% IF patrons_with_acq_perm_only %]
144                     ,{
145                         'name': 'has_permission',
146                         'value': 'acquisition.order_manage',
147                     }
148                     [% END %]
149                     );
150                     $.ajax({
151                         'dataType': 'json',
152                         'type': 'POST',
153                         'url': sSource,
154                         'data': aoData,
155                         'success': function(json){
156                             fnCallback(json);
157                         }
158                     });
159                 },
160                 'aoColumns':[
161                     [% FOR column IN columns %]
162                         [% IF column == 'action' %]
163                             { 'mDataProp': 'dt_action', 'bSortable': false, 'sClass': 'actions' }
164                         [% ELSIF column == 'address' %]
165                             { 'mDataProp': 'dt_address', 'bSortable': false }
166                         [% ELSE %]
167                             { 'mDataProp': 'dt_[% column %]' }
168                         [% END %]
169                         [% UNLESS loop.last %],[% END %]
170                     [% END %]
171                 ],
172                 'bAutoWidth': false,
173                 [% IF patrons_with_acq_perm_only %]
174                     'bPaginate': false,
175                 [% ELSE %]
176                     'sPaginationType': 'full_numbers',
177                     "iDisplayLength": [% Koha.Preference('PatronsPerPage') %],
178                 [% END %]
179                 'aaSorting': [[[% aaSorting || 0 %], 'asc']],
180                 'bFilter': false,
181                 'bProcessing': true,
182             }));
183
184             $("#searchform").on('submit', filter);
185             $(".filterByLetter").on("click",function(e){
186                 e.preventDefault();
187                 filterByFirstLetterSurname($(this).text());
188             });
189             $("body").on("click",".add_user",function(e){
190                 e.preventDefault();
191                 var borrowernumber = $(this).data("borrowernumber");
192                 var firstname = $(this).data("firstname");
193                 var surname = $(this).data("surname");
194                 add_user( borrowernumber, firstname + " " + surname );
195             });
196
197             $("body").on("click",".select_user",function(e){
198                 e.preventDefault();
199                 var borrowernumber = $(this).data("borrowernumber");
200                 var borrower_data = $("#borrower_data"+borrowernumber).val();
201                 select_user( borrowernumber, JSON.parse(borrower_data) );
202             });
203
204         });
205
206         function filter() {
207             search = 1;
208             $("#firstletter_filter").val('');
209             $("#searchresults").show();
210             dtMemberResults.fnDraw();
211             return false;
212         }
213
214         // User has clicked on a letter
215         function filterByFirstLetterSurname(letter) {
216             $("#firstletter_filter").val(letter);
217             search = 1;
218             $("#searchresults").show();
219             dtMemberResults.fnDraw();
220         }
221
222         // modify parent window owner element
223         [% IF selection_type == 'add' %]
224             function add_user(borrowernumber, borrowername) {
225                 var p = window.opener;
226                 // In one place (serials/routing.tt), the page is reload on every add
227                 // We have to wait for the page to be there
228                 function wait_for_opener () {
229                     if ( ! $(opener.document).find('body').size() ) {
230                         setTimeout(wait_for_opener, 500);
231                     } else {
232                         [%# Note that add_user could sent data instead of borrowername too %]
233                         $("#info").hide();
234                         $("#error").hide();
235                         if ( p.add_user(borrowernumber, borrowername) < 0 ) {
236                             $("#error").html(_("Patron '%s' is already in the list.").format(borrowername));
237                             $("#error").show();
238                         } else {
239                             $("#info").html(_("Patron '%s' added.").format(borrowername));
240                             $("#info").show();
241                         }
242                     }
243                 }
244                 wait_for_opener();
245             }
246         [% ELSIF selection_type == 'select' %]
247             function select_user(borrowernumber, data) {
248                 var p = window.opener;
249                 p.select_user(borrowernumber, data);
250                 window.close();
251             }
252         [% END %]
253     </script>
254 [% END %]
255
256 [% SET popup_window = 1 %]
257 [% INCLUDE 'intranet-bottom.inc' %]