]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
LP#1452950 patron dupe search / plumbing
[working/Evergreen.git] / Open-ILS / src / templates / staff / circ / patron / t_edit.tt2
1 [% DOC_IMG = '/images/question-mark.png' %]
2
3 <!-- register banner -->
4 <div ng-if="!patron_id" class='patron-reg-fixed-bar'>
5
6   <div class="container-fluid" style="text-align:center">
7     <div class="alert alert-info alert-less-pad strong-text-2">
8       <span >[% l('Register Patron') %]</span>
9     </div>
10   </div>
11
12   <div class="flex-row" class='patron-reg-actions-bar'>
13     [% INCLUDE 'staff/circ/patron/reg_actions.tt2' %]
14   </div>
15 </div>
16
17
18 <!-- edit banner -->
19 <div ng-if="patron_id"
20     class="strong-text-2">[% l('Patron Edit') %]</div>
21
22 <!-- IDL field documentation window -->
23 <fieldset id="reg-field-doc" ng-show="selected_field_doc">
24   <legend>
25   {{idl_fields[selected_field_doc.fm_class()][selected_field_doc.field()].label}}
26   </legend>
27   <div>{{selected_field_doc.string()}}</div>
28 </fieldset>
29
30 [% MACRO formfield(cls, field, path, input_type) BLOCK;
31
32   # input field generator for common text/number/checkbox fields
33
34   IF NOT input_type; input_type = 'text'; END %] 
35
36 <div class="row reg-field-row" 
37   ng-show="show_field('[% cls _ '.' _ field %]')">
38
39   <div class="col-md-3 reg-field-label"> <!-- field label -->
40
41     <label>{{idl_fields.[% cls %].[% field %].label}}</label>
42
43     <!-- field documentation img/link -->
44     <img ng-show="field_doc.[% cls %].[% field %]" 
45       ng-click="set_selected_field_doc('[% cls %]','[% field %]')"
46       src='[% DOC_IMG %]'></img>
47   </div>
48
49   <div class="col-md-3 reg-field-input"> <!-- field form input -->
50
51   [% model = path ? 'patron.' _ path _ '.' _ field : 'patron.' _ field %]
52
53   [% IF input_type == 'checkbox' %]
54
55     <div class='checkbox'>
56       <input type='checkbox' ng-model='[% model %]'/>
57     </div>
58
59   [% ELSE %]
60     <!-- text / number input -->
61
62     [% IF field == 'alert_message' %]
63       <textarea class="form-control" ng-model="[% model %]"/>
64     [% ELSIF field == 'post_code' %]
65       <input type="text" ng-blur="post_code_changed(patron.[% path %])"
66         class="form-control" ng-model="[% model %]"/>
67     [% ELSIF field == 'barcode' %]
68       <input type="text" 
69         focus-me="focus_bc"
70         ng-disabled="disable_bc"
71         ng-blur="barcode_changed(patron.card.barcode)"
72         class="form-control" ng-model="[% model %]"/>
73     [% ELSIF field == 'usrname' %]
74       <input type="text" 
75         focus-me="focus_usrname"
76         ng-blur="usrname_changed(patron.usrname)"
77         class="form-control" ng-model="[% model %]"/>
78     [% ELSIF field == 'day_phone' %]
79       <input type="text" 
80         ng-blur="day_phone_changed(patron.day_phone)"
81         class="form-control" ng-model="[% model %]"/>
82     [% ELSIF field.match('phone') %]
83       <input type="text" 
84         ng-blur="dupe_value_changed('phone', patron.[% field %])"
85         class="form-control" ng-model="[% model %]"/>
86     [% ELSIF field.match('ident_value') %]
87       <input type="text" 
88         ng-blur="dupe_value_changed('ident', patron.[% field %])"
89         class="form-control" ng-model="[% model %]"/>
90     [% ELSIF field == 'first_given_name' OR field == 'family_name' %]
91       <input type="text" 
92         ng-blur="dupe_value_changed('name', patron.[% field %])"
93         class="form-control" ng-model="[% model %]"/>
94     [% ELSIF field == 'email' %]
95       <input type="[% input_type %]" 
96         ng-blur="dupe_value_changed('email', patron.email)"
97         class="form-control" ng-model="[% model %]"/>
98     [% ELSIF field.match('street') OR field == 'city' %]
99       <!-- note: passing address object to dupe_value_changed -->
100       <input type="[% input_type %]" 
101         ng-blur="dupe_value_changed('address', patron.[% path %])"
102         class="form-control" ng-model="[% model %]"/>
103     [% ELSE %]
104       <input type="[% input_type %]" 
105         class="form-control" ng-model="[% model %]"/>
106     [% END %]
107   [% END %]
108
109   </div>
110
111   <!-- supplemental actions and example text -->
112   <div class="col-md-6 patron-reg-example">
113
114     [% IF field == 'barcode' %]
115
116       <button class="btn btn-default" ng-show="!patron.isnew"
117         ng-click="replace_card()">[% l('Replace Barcode') %]</button>
118       <button class="btn btn-default" 
119         ng-click="cards_dialog()">[% l('See All') %]</button>
120
121     [% ELSIF field == 'passwd' %]
122
123       <button class="btn btn-default" ng-click="generate_password()">
124         [% l('Generate Password') %]</button>
125
126     [% ELSE %]
127
128       <!-- invalidate buttons -->
129
130       [% IF field.match('phone') OR field.match('email') %]
131         <button ng-show="patron.[% field %] && !patron.isnew" 
132             class="btn btn-default" 
133             ng-click="invalidate_field('[% field %]')">
134             [% l('Invalidate') %]
135         </button>
136       [% END %]
137
138       <!-- example strings -->
139
140       [% set_str = "org_settings['ui.patron.edit." _ 
141           cls _ "." _ field _ ".example']"; %]
142
143       <span ng-if="[% set_str %]">
144         [% l('Example: [_1]', "{{" _ set_str _ "}}") %]
145       </span>
146
147       <!-- phones have a fall-through example strings -->
148       [% IF field.match('phone') %]
149         <span ng-if="![% set_str %] && org_settings['ui.patron.edit.phone.example']">
150           [% l('Example: [_1]', 
151           "{{org_settings['ui.patron.edit.phone.example']}}") %]
152         </span>
153       [% END %]
154     [% END %]
155   </div>
156 </div>
157 [% END %]
158
159 <!-- progress dialog displayed as we await all data to finish loading -->
160 <div class="row" ng-show="!page_data_loaded">
161   <div class="col-md-6 pad-vert">
162     <div class="progress progress-striped active">
163         <div class="progress-bar"  role="progressbar" aria-valuenow="100" 
164               aria-valuemin="0" aria-valuemax="100" style="width: 100%">
165             <span class="sr-only">[% l('Loading...') %]</span>
166         </div>
167     </div>
168   </div>
169 </div>
170
171 <!-- this div wraps the entire form so we can hide it 
172      until all needed data has been loaded -->
173 <div ng-show="page_data_loaded"><!-- form wrapper -->
174
175 [% formfield('ac', 'barcode', 'card') %]
176 [% formfield('au', 'usrname') %]
177 [% formfield('au', 'passwd') %]
178 [% formfield('au', 'prefix') %]
179 [% formfield('au', 'first_given_name') %]
180 [% formfield('au', 'second_given_name') %]
181 [% formfield('au', 'family_name') %]
182 [% formfield('au', 'suffix') %]
183 [% formfield('au', 'alias') %]
184
185 <div class="row reg-field-row" ng-show="show_field('au.dob')">
186   <div class="col-md-3 reg-field-label">
187     <label>{{idl_fields.au.dob.label}}</label>
188     <img ng-show="field_doc.au.dob" 
189       ng-click="selected_field_doc=field_doc.au.dob"
190       src='[% DOC_IMG %]'></img>
191   </div>
192   <div class="col-md-3 reg-field-input">
193     <input eg-date-input 
194       class="form-control" ng-model="patron.dob"/>
195   </div>
196 </div>
197
198 [% formfield('au', 'juvenile', '', 'checkbox') %]
199
200 <!-- ident_type -->
201
202 <div class="row reg-field-row" ng-show="show_field('au.ident_type')">
203   <div class="col-md-3 reg-field-label">
204     <label>{{idl_fields.au.ident_type.label}}</label>
205     <img ng-show="field_doc.au.ident_type" 
206       ng-click="selected_field_doc=field_doc.au.ident_type"
207       src='[% DOC_IMG %]'></img>
208   </div>
209   <div class="col-md-3 reg-field-input">
210     <div class="btn-group" dropdown>
211       <button type="button" class="btn btn-default dropdown-toggle">
212         <span style="padding-right: 5px;">
213           {{patron.ident_type.name() || "[% l('Primary Ident Type') %]"}}
214         </span>
215         <span class="caret"></span>
216       </button>
217       <ul class="dropdown-menu">
218         <li ng-repeat="type in ident_types">
219           <a href ng-click="patron.ident_type = type">{{type.name()}}</a>
220         </li>
221       </ul>
222     </div>
223   </div>
224 </div>
225
226
227 [% formfield('au', 'ident_value') %]
228 [% formfield('au', 'ident_value2') %]
229 [% formfield('au', 'email', '', 'email') %]
230 [% formfield('au', 'day_phone') %]
231 [% formfield('au', 'evening_phone') %]
232 [% formfield('au', 'other_phone') %]
233
234 <!-- home org unit selector -->
235
236 <div class="row reg-field-row" ng-show="show_field('au.home_ou')">
237   <div class="col-md-3 reg-field-label">
238     <label>{{idl_fields.au.home_ou.label}}</label>
239     <img ng-show="field_doc.au.home_ou" 
240       ng-click="selected_field_doc=field_doc.au.home_ou"
241       src='[% DOC_IMG %]'></img>
242     </div>
243     <div class="col-md-3 reg-field-input">
244       <eg-org-selector selected="patron.home_ou" onchange="">
245       </eg-org-selector>
246   </div>
247 </div>
248
249 <!-- profile selector -->
250
251 <div class="row reg-field-row" ng-show="show_field('au.profile')">
252   <div class="col-md-3 reg-field-label">
253     <label>{{idl_fields.au.profile.label}}</label>
254     <img ng-show="field_doc.au.profile" 
255       ng-click="selected_field_doc=field_doc.au.profile"
256       src='[% DOC_IMG %]'></img>
257   </div>
258   <div class="col-md-3 reg-field-input">
259     <div class="btn-group" dropdown>
260       <button type="button" class="btn btn-default dropdown-toggle">
261         <span style="padding-right: 5px;">
262           {{patron.profile.name() || "[% l('Profile Group') %]"}}
263         </span>
264         <span class="caret"></span>
265       </button>
266       <ul class="dropdown-menu">
267         <li ng-repeat="grp in edit_profiles">
268           <a href 
269             style="padding-left: {{pgt_depth(grp) * 10 + 5}}px"
270             ng-click="set_profile(grp)">{{grp.name()}}</a>
271         </li>
272       </ul>
273     </div>
274   </div>
275   <div class="col-md-3">
276     <button class="btn btn-default" ng-disabled="!has_group_link_perm"
277       ng-click="secondary_groups_dialog()">[% l('Secondary Groups') %]</button>
278   </div> 
279 </div>
280
281 <div class="row reg-field-row" ng-show="show_field('au.expire_date')">
282   <div class="col-md-3 reg-field-label">
283   <label>{{idl_fields.au.expire_date.label}}</label>
284     <img ng-show="field_doc.au.expire_date" 
285     ng-click="selected_field_doc=field_doc.au.expire_date"
286     src='[% DOC_IMG %]'></img>
287   </div>
288   <div class="col-md-3 reg-field-input">
289     <input eg-date-input 
290       class="form-control" ng-model="patron.expire_date"/>
291   </div>
292   <div class="col-md-3">
293     <button class="btn btn-default" ng-click="set_expire_date()">
294       [% l('Update Expire Date') %]</button>
295   </div>
296 </div>
297
298 <!-- net_access_level -->
299
300 <div class="row reg-field-row" ng-show="show_field('au.net_access_level')">
301   <div class="col-md-3 reg-field-label">
302     <label>{{idl_fields.au.net_access_level.label}}</label>
303     <img ng-show="field_doc.au.net_access_level" 
304       ng-click="selected_field_doc=field_doc.au.net_access_level"
305       src='[% DOC_IMG %]'></img>
306   </div>
307   <div class="col-md-3 reg-field-input">
308     <div class="btn-group" dropdown>
309       <button type="button" class="btn btn-default dropdown-toggle">
310         <span style="padding-right: 5px;">
311           {{patron.net_access_level.name() || "[% l('Net Access Level') %]"}}
312         </span>
313         <span class="caret"></span>
314       </button>
315       <ul class="dropdown-menu">
316         <li ng-repeat="level in net_access_levels">
317           <a href 
318             ng-click="patron.net_access_level = level">{{level.name()}}</a>
319         </li>
320       </ul>
321     </div>
322   </div>
323 </div>
324
325 [% formfield('au', 'active', '', 'checkbox') %]
326 [% formfield('au', 'barred', '', 'checkbox') %]
327 [% formfield('au', 'master_account', '', 'checkbox') %]
328 [% formfield('au', 'claims_returned_count', '', 'number') %]
329 [% formfield('au', 'claims_never_checked_out_count', '', 'number') %]
330 [% formfield('au', 'alert_message') %]
331
332 <div class="alert alert-success row" role="alert">
333   <div class="col-md-6">[% l('User Settings') %]</div>
334 </div>
335
336 <div class="row reg-field-row">
337   <div class="col-md-3 reg-field-label">
338     <label>{{user_setting_types['opac.default_phone'].label()}}</label>
339   </div>
340   <div class="col-md-3 reg-field-input">
341     <input type='text' ng-model="user_settings['opac.default_phone']"/>
342   </div>
343 </div>
344
345 <div class="row reg-field-row">
346   <div class="col-md-3 reg-field-label">
347     <label>{{user_setting_types['opac.default_pickup_location'].label()}}</label>
348   </div>
349   <div class="col-md-3 reg-field-input">
350     <eg-org-selector selected="patron.home_ou" onchange=""></eg-org-selector>
351   </div>
352 </div>
353
354 <div class="row reg-field-row">
355   <div class="col-md-3 reg-field-label">
356     <label>{{user_setting_types['circ.holds_behind_desk'].label()}}</label>
357   </div>
358   <div class="col-md-3 reg-field-input">
359     <div class='checkbox'>
360       <input type='checkbox' ng-model="user_settings['circ.holds_behind_desk']"/>
361     </div>
362   </div>
363 </div>
364
365 <div class="row reg-field-row">
366   <div class="col-md-3 reg-field-label">
367     <label>[% l('Holds Notices') %]</label>
368   </div>
369   <div class="col-md-3 reg-field-input flex-row">
370     <div class='flex-cell'>
371       <input type='checkbox' ng-model="hold_notify_phone"/>
372       [% l('Phone') %]
373     </div>
374     <div class='flex-cell'>
375       <input type='checkbox' ng-model="hold_notify_email"/>
376       [% l('Email') %]
377     </div>
378     <div class='flex-cell' ng-if="org_settings['sms.enable']">
379       <input type='checkbox' ng-model="hold_notify_sms"/>
380       [% l('SMS') %]
381     </div>
382   </div>
383 </div>
384
385 <div class="row reg-field-row" ng-if="org_settings['sms.enable']">
386   <div class="col-md-3 reg-field-label">
387     <label>[% l('Default SMS/Text Number') %]</label>
388   </div>
389   <div class="col-md-3 reg-field-input">
390     <input type='text'/>
391   </div>
392 </div>
393
394 <div class="row reg-field-row" ng-if="org_settings['sms.enable']">
395   <div class="col-md-3 reg-field-label">
396     <label>[% l('Default SMS Carrier') %]</label>
397   </div>
398   <div class="col-md-3 reg-field-input">
399     <div class="btn-group" dropdown>
400       <button type="button" class="btn btn-default dropdown-toggle">
401         <span style="padding-right: 5px;"></span>
402         <span class="caret"></span>
403       </button>
404       <ul class="dropdown-menu">
405         <li ng-repeat="carrier in sms_carriers">
406           <a href 
407             ng-click="user_settings['opac.default_sms_carrier'] = carrier">
408                 {{carrier.name()}}
409           </a>
410         </li>
411       </ul>
412     </div>
413   </div>
414 </div>
415
416 <div class="row reg-field-row" ng-repeat="type in opt_in_setting_types">
417   <div class="col-md-3 reg-field-label">
418     <label>{{type.label()}}</label>
419   </div>
420   <div class="col-md-3 reg-field-input">
421     <input type='checkbox' ng-model="user_settings[type.name()]"/>
422   </div>
423 </div>
424
425 <!-- addresses -->
426
427 <div ng-repeat="addr in patron.addresses">
428   <div class="alert alert-success row" role="alert">
429       <div class="col-md-3">[% l('Address') %]</div>
430       <div class="col-md-3">
431           <span class='pad-all-min'>
432             [% l('Mailing') %] <input type='checkbox' 
433               ng-change="set_addr_type(addr, 'mailing')" 
434               ng-model="addr._is_mailing"/>
435           </span>
436           <span class='pad-all-min'>
437             [% l('Physical') %] <input type='checkbox' 
438               ng-change="set_addr_type(addr, 'billing')" 
439               ng-model="addr._is_billing"/>
440           </span>
441           <span class='pad-all-min'>
442             <button type="button" ng-click="delete_address(addr.id)" 
443               class="btn btn-danger">[% l('X') %]</button>
444           </span>
445       </div>
446   </div>
447
448   [% formfield('aua', 'address_type', 'addresses[$index]') %]
449   [% formfield('aua', 'post_code', 'addresses[$index]') %]
450   [% formfield('aua', 'street1', 'addresses[$index]') %]
451   [% formfield('aua', 'street2', 'addresses[$index]') %]
452   [% formfield('aua', 'city', 'addresses[$index]') %]
453   [% formfield('aua', 'county', 'addresses[$index]') %]
454   [% formfield('aua', 'state', 'addresses[$index]') %]
455   [% formfield('aua', 'country', 'addresses[$index]') %]
456   [% formfield('aua', 'valid', 'addresses[$index]', 'checkbox') %]
457   [% formfield('aua', 'within_city_limits', 'addresses[$index]', 'checkbox') %]
458
459   <div class="row" ng-if="$last">
460     <button type="button" ng-click="new_address()" 
461       class="btn btn-success">[% l('New Address') %]</button>
462   </div>
463
464   <!-- pending address -->
465
466 </div> <!-- addresses -->
467
468 <div class="alert alert-success row" role="alert" 
469     ng-show="show_field('stat_cats')" ng-if="stat_cats.length > 0">
470     <div class="col-md-6">[% l('Statistical Categories') %]</div>
471 </div>
472
473 <div class="row reg-field-row" 
474     ng-show="show_field('stat_cats')" ng-repeat="cat in stat_cats">
475   <div class="col-md-3 reg-field-label">
476     <label>{{cat.name()}}</label>
477   </div>
478   <div class="col-md-3 reg-field-input">
479     <div ng-if="cat.entries().length == 0">
480       <input type="text" class="form-control"/>
481     </div>
482     <div ng-if="cat.entries().length != 0">
483       <div class="btn-group" dropdown>
484         <button type="button" class="btn btn-default dropdown-toggle">
485           <span style="padding-right: 5px;">
486             {{stat_cat_entry_maps[cat.id()].value()}}</span>
487           <span class="caret"></span>
488         </button>
489         <ul class="dropdown-menu">
490           <li ng-repeat="entry in cat.entries()">
491             <a href ng-click="stat_cat_entry_maps[cat.id()]=entry"> 
492               {{entry.value()}}
493             </a>
494           </li>
495         </ul>
496       </div>
497     </div>
498   </div>
499 </div>
500
501 <!-- surveys -->
502
503 <div class="alert alert-success row" role="alert" 
504     ng-show="show_field('surveys')" ng-if="surveys.length > 0">
505     <div class="col-md-6">[% l('Surveys') %]</div>
506 </div>
507
508 <div class="row reg-field-row" 
509     ng-show="show_field('surveys')" ng-repeat="survey in surveys">
510   <div class="col-md-3 reg-field-label">
511     <label>{{survey.name()}}</label>
512   </div>
513   <div class="col-md-6 reg-field-input">
514     <div class="row" ng-repeat="question in survey.questions()" 
515       style="margin-bottom: 10px;">
516       <div class="col-md-6">{{question.question()}}</div>
517       <div class="col-md-6">
518         <div class="btn-group" dropdown>
519           <button type="button" class="btn btn-default dropdown-toggle">
520             <span style="padding-right: 5px;">
521               {{survey_responses[question.id()].answer()}}
522             </span>
523             <span class="caret"></span>
524           </button>
525           <ul class="dropdown-menu">
526             <li ng-repeat="answer in question.answers()">
527               <a href ng-click="survey_responses[question.id()] = answer"> 
528                 {{answer.answer()}} 
529               </a>
530             </li>
531           </ul>
532         </div>
533       </div>
534     </div>
535   </div>
536 </div>
537
538 </div><!-- /form wrapper -->