1 [% DOC_IMG = '/images/question-mark.png' %]
3 <!-- register banner -->
4 <div ng-if="!patron_id" class='patron-reg-fixed-bar'>
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>
12 <div class="flex-row" class='patron-reg-actions-bar'>
13 [% INCLUDE 'staff/circ/patron/reg_actions.tt2' %]
19 <div ng-if="patron_id"
20 class="strong-text-2">[% l('Patron Edit') %]</div>
23 <div id="reg-alert-pane">
25 <div id="reg-dupe-links">
26 [%# dupe_search_encoded is uri escaped in the JS %]
28 <a target="_blank" ng-show="dupe_counts.name"
29 href="/eg/staff/circ/patron/search?search={{dupe_search_encoded}}" >
30 [% l('[_1] patron(s) with same name', '{{dupe_counts.name}}') %]
34 <a target="_blank" ng-show="dupe_counts.email"
35 href="/eg/staff/circ/patron/search?search={{dupe_search_encoded}}" >
36 [% l('[_1] patron(s) with same email',
37 '{{dupe_counts.email}}') %]</a>
40 <a target="_blank" ng-show="dupe_counts.ident"
41 href="/eg/staff/circ/patron/search?search={{dupe_search_encoded}}" >
42 [% l('[_1] patron(s) with same identification',
43 '{{dupe_counts.ident}}') %]</a>
46 <a target="_blank" ng-show="dupe_counts.phone"
47 href="/eg/staff/circ/patron/search?search={{dupe_search_encoded}}" >
48 [% l('[_1] patron(s) with same phone',
49 '{{dupe_counts.phone}}') %]</a>
52 <a target="_blank" ng-show="dupe_counts.address"
53 href="/eg/staff/circ/patron/search?search={{dupe_search_encoded}}" >
54 [% l('[_1] patron(s) with same address',
55 '{{dupe_counts.address}}') %]</a>
59 <!-- IDL field documentation window -->
60 <fieldset id="reg-field-doc" ng-show="selected_field_doc">
62 {{idl_fields[selected_field_doc.fm_class()][selected_field_doc.field()].label}}
64 <div>{{selected_field_doc.string()}}</div>
69 [% MACRO formfield(cls, field, path, input_type) BLOCK;
71 # input field generator for common text/number/checkbox fields
73 IF NOT input_type; input_type = 'text'; END %]
75 <div class="row reg-field-row"
76 ng-show="show_field('[% cls _ '.' _ field %]')">
78 <div class="col-md-3 reg-field-label"> <!-- field label -->
80 <label>{{idl_fields.[% cls %].[% field %].label}}</label>
82 <!-- field documentation img/link -->
83 <img ng-show="field_doc.[% cls %].[% field %]"
84 ng-click="set_selected_field_doc('[% cls %]','[% field %]')"
85 src='[% DOC_IMG %]'></img>
88 <div class="col-md-3 reg-field-input"> <!-- field form input -->
90 [% model = path ? 'patron.' _ path _ '.' _ field : 'patron.' _ field %]
92 [% IF input_type == 'checkbox' %]
94 <div class='checkbox'>
95 <input type='checkbox' ng-model='[% model %]'/>
99 <!-- text / number input -->
101 [% IF field == 'alert_message' %]
102 <textarea class="form-control" ng-model="[% model %]"/>
103 [% ELSIF field == 'post_code' %]
104 <input type="text" ng-blur="post_code_changed(patron.[% path %])"
105 class="form-control" ng-model="[% model %]"/>
106 [% ELSIF field == 'barcode' %]
109 ng-disabled="disable_bc"
110 ng-blur="barcode_changed(patron.card.barcode)"
111 class="form-control" ng-model="[% model %]"/>
112 [% ELSIF field == 'usrname' %]
114 focus-me="focus_usrname"
115 ng-blur="usrname_changed(patron.usrname)"
116 class="form-control" ng-model="[% model %]"/>
117 [% ELSIF field == 'day_phone' %]
119 ng-blur="day_phone_changed(patron.day_phone)"
120 class="form-control" ng-model="[% model %]"/>
121 [% ELSIF field.match('phone') %]
123 ng-blur="dupe_value_changed('phone', patron.[% field %])"
124 class="form-control" ng-model="[% model %]"/>
125 [% ELSIF field.match('ident_value') %]
127 ng-blur="dupe_value_changed('ident', patron.[% field %])"
128 class="form-control" ng-model="[% model %]"/>
129 [% ELSIF field == 'first_given_name' OR field == 'family_name' %]
131 ng-blur="dupe_value_changed('name', patron.[% field %])"
132 class="form-control" ng-model="[% model %]"/>
133 [% ELSIF field == 'email' %]
134 <input type="[% input_type %]"
135 ng-blur="dupe_value_changed('email', patron.email)"
136 class="form-control" ng-model="[% model %]"/>
137 [% ELSIF field.match('street') OR field == 'city' %]
138 <!-- note: passing address object to dupe_value_changed -->
139 <input type="[% input_type %]"
140 ng-blur="dupe_value_changed('address', patron.[% path %])"
141 class="form-control" ng-model="[% model %]"/>
143 <input type="[% input_type %]"
144 class="form-control" ng-model="[% model %]"/>
150 <!-- supplemental actions and example text -->
151 <div class="col-md-6 patron-reg-example">
153 [% IF field == 'barcode' %]
155 <button class="btn btn-default" ng-show="!patron.isnew"
156 ng-click="replace_card()">[% l('Replace Barcode') %]</button>
157 <button class="btn btn-default"
158 ng-click="cards_dialog()">[% l('See All') %]</button>
160 [% ELSIF field == 'passwd' %]
162 <button class="btn btn-default" ng-click="generate_password()">
163 [% l('Generate Password') %]</button>
167 <!-- invalidate buttons -->
169 [% IF field.match('phone') OR field.match('email') %]
170 <button ng-show="patron.[% field %] && !patron.isnew"
171 class="btn btn-default"
172 ng-click="invalidate_field('[% field %]')">
173 [% l('Invalidate') %]
177 <!-- example strings -->
179 [% set_str = "org_settings['ui.patron.edit." _
180 cls _ "." _ field _ ".example']"; %]
182 <span ng-if="[% set_str %]">
183 [% l('Example: [_1]', "{{" _ set_str _ "}}") %]
186 <!-- phones have a fall-through example strings -->
187 [% IF field.match('phone') %]
188 <span ng-if="![% set_str %] && org_settings['ui.patron.edit.phone.example']">
189 [% l('Example: [_1]',
190 "{{org_settings['ui.patron.edit.phone.example']}}") %]
198 <!-- progress dialog displayed as we await all data to finish loading -->
199 <div class="row" ng-show="!page_data_loaded">
200 <div class="col-md-6 pad-vert">
201 <div class="progress progress-striped active">
202 <div class="progress-bar" role="progressbar" aria-valuenow="100"
203 aria-valuemin="0" aria-valuemax="100" style="width: 100%">
204 <span class="sr-only">[% l('Loading...') %]</span>
210 <!-- this div wraps the entire form so we can hide it
211 until all needed data has been loaded -->
212 <div ng-show="page_data_loaded"><!-- form wrapper -->
214 [% formfield('ac', 'barcode', 'card') %]
215 [% formfield('au', 'usrname') %]
216 [% formfield('au', 'passwd') %]
217 [% formfield('au', 'prefix') %]
218 [% formfield('au', 'first_given_name') %]
219 [% formfield('au', 'second_given_name') %]
220 [% formfield('au', 'family_name') %]
221 [% formfield('au', 'suffix') %]
222 [% formfield('au', 'alias') %]
224 <div class="row reg-field-row" ng-show="show_field('au.dob')">
225 <div class="col-md-3 reg-field-label">
226 <label>{{idl_fields.au.dob.label}}</label>
227 <img ng-show="field_doc.au.dob"
228 ng-click="selected_field_doc=field_doc.au.dob"
229 src='[% DOC_IMG %]'></img>
231 <div class="col-md-3 reg-field-input">
233 class="form-control" ng-model="patron.dob"/>
237 [% formfield('au', 'juvenile', '', 'checkbox') %]
241 <div class="row reg-field-row" ng-show="show_field('au.ident_type')">
242 <div class="col-md-3 reg-field-label">
243 <label>{{idl_fields.au.ident_type.label}}</label>
244 <img ng-show="field_doc.au.ident_type"
245 ng-click="selected_field_doc=field_doc.au.ident_type"
246 src='[% DOC_IMG %]'></img>
248 <div class="col-md-3 reg-field-input">
249 <div class="btn-group" dropdown>
250 <button type="button" class="btn btn-default dropdown-toggle">
251 <span style="padding-right: 5px;">
252 {{patron.ident_type.name() || "[% l('Primary Ident Type') %]"}}
254 <span class="caret"></span>
256 <ul class="dropdown-menu">
257 <li ng-repeat="type in ident_types">
258 <a href ng-click="patron.ident_type = type">{{type.name()}}</a>
266 [% formfield('au', 'ident_value') %]
267 [% formfield('au', 'ident_value2') %]
268 [% formfield('au', 'email', '', 'email') %]
269 [% formfield('au', 'day_phone') %]
270 [% formfield('au', 'evening_phone') %]
271 [% formfield('au', 'other_phone') %]
273 <!-- home org unit selector -->
275 <div class="row reg-field-row" ng-show="show_field('au.home_ou')">
276 <div class="col-md-3 reg-field-label">
277 <label>{{idl_fields.au.home_ou.label}}</label>
278 <img ng-show="field_doc.au.home_ou"
279 ng-click="selected_field_doc=field_doc.au.home_ou"
280 src='[% DOC_IMG %]'></img>
282 <div class="col-md-3 reg-field-input">
283 <eg-org-selector selected="patron.home_ou" onchange="">
288 <!-- profile selector -->
290 <div class="row reg-field-row" ng-show="show_field('au.profile')">
291 <div class="col-md-3 reg-field-label">
292 <label>{{idl_fields.au.profile.label}}</label>
293 <img ng-show="field_doc.au.profile"
294 ng-click="selected_field_doc=field_doc.au.profile"
295 src='[% DOC_IMG %]'></img>
297 <div class="col-md-3 reg-field-input">
298 <div class="btn-group" dropdown>
299 <button type="button" class="btn btn-default dropdown-toggle">
300 <span style="padding-right: 5px;">
301 {{patron.profile.name() || "[% l('Profile Group') %]"}}
303 <span class="caret"></span>
305 <ul class="dropdown-menu">
306 <li ng-repeat="grp in edit_profiles">
308 style="padding-left: {{pgt_depth(grp) * 10 + 5}}px"
309 ng-click="set_profile(grp)">{{grp.name()}}</a>
314 <div class="col-md-3">
315 <button class="btn btn-default" ng-disabled="!has_group_link_perm"
316 ng-click="secondary_groups_dialog()">[% l('Secondary Groups') %]</button>
320 <div class="row reg-field-row" ng-show="show_field('au.expire_date')">
321 <div class="col-md-3 reg-field-label">
322 <label>{{idl_fields.au.expire_date.label}}</label>
323 <img ng-show="field_doc.au.expire_date"
324 ng-click="selected_field_doc=field_doc.au.expire_date"
325 src='[% DOC_IMG %]'></img>
327 <div class="col-md-3 reg-field-input">
329 class="form-control" ng-model="patron.expire_date"/>
331 <div class="col-md-3">
332 <button class="btn btn-default" ng-click="set_expire_date()">
333 [% l('Update Expire Date') %]</button>
337 <!-- net_access_level -->
339 <div class="row reg-field-row" ng-show="show_field('au.net_access_level')">
340 <div class="col-md-3 reg-field-label">
341 <label>{{idl_fields.au.net_access_level.label}}</label>
342 <img ng-show="field_doc.au.net_access_level"
343 ng-click="selected_field_doc=field_doc.au.net_access_level"
344 src='[% DOC_IMG %]'></img>
346 <div class="col-md-3 reg-field-input">
347 <div class="btn-group" dropdown>
348 <button type="button" class="btn btn-default dropdown-toggle">
349 <span style="padding-right: 5px;">
350 {{patron.net_access_level.name() || "[% l('Net Access Level') %]"}}
352 <span class="caret"></span>
354 <ul class="dropdown-menu">
355 <li ng-repeat="level in net_access_levels">
357 ng-click="patron.net_access_level = level">{{level.name()}}</a>
364 [% formfield('au', 'active', '', 'checkbox') %]
365 [% formfield('au', 'barred', '', 'checkbox') %]
366 [% formfield('au', 'master_account', '', 'checkbox') %]
367 [% formfield('au', 'claims_returned_count', '', 'number') %]
368 [% formfield('au', 'claims_never_checked_out_count', '', 'number') %]
369 [% formfield('au', 'alert_message') %]
371 <div class="alert alert-success row" role="alert">
372 <div class="col-md-6">[% l('User Settings') %]</div>
375 <div class="row reg-field-row">
376 <div class="col-md-3 reg-field-label">
377 <label>{{user_setting_types['opac.default_phone'].label()}}</label>
379 <div class="col-md-3 reg-field-input">
380 <input type='text' ng-model="user_settings['opac.default_phone']"/>
384 <div class="row reg-field-row">
385 <div class="col-md-3 reg-field-label">
386 <label>{{user_setting_types['opac.default_pickup_location'].label()}}</label>
388 <div class="col-md-3 reg-field-input">
389 <eg-org-selector selected="patron.home_ou" onchange=""></eg-org-selector>
393 <div class="row reg-field-row">
394 <div class="col-md-3 reg-field-label">
395 <label>{{user_setting_types['circ.holds_behind_desk'].label()}}</label>
397 <div class="col-md-3 reg-field-input">
398 <div class='checkbox'>
399 <input type='checkbox' ng-model="user_settings['circ.holds_behind_desk']"/>
404 <div class="row reg-field-row">
405 <div class="col-md-3 reg-field-label">
406 <label>[% l('Holds Notices') %]</label>
408 <div class="col-md-3 reg-field-input flex-row">
409 <div class='flex-cell'>
410 <input type='checkbox' ng-model="hold_notify_phone"/>
413 <div class='flex-cell'>
414 <input type='checkbox' ng-model="hold_notify_email"/>
417 <div class='flex-cell' ng-if="org_settings['sms.enable']">
418 <input type='checkbox' ng-model="hold_notify_sms"/>
424 <div class="row reg-field-row" ng-if="org_settings['sms.enable']">
425 <div class="col-md-3 reg-field-label">
426 <label>[% l('Default SMS/Text Number') %]</label>
428 <div class="col-md-3 reg-field-input">
433 <div class="row reg-field-row" ng-if="org_settings['sms.enable']">
434 <div class="col-md-3 reg-field-label">
435 <label>[% l('Default SMS Carrier') %]</label>
437 <div class="col-md-3 reg-field-input">
438 <div class="btn-group" dropdown>
439 <button type="button" class="btn btn-default dropdown-toggle">
440 <span style="padding-right: 5px;"></span>
441 <span class="caret"></span>
443 <ul class="dropdown-menu">
444 <li ng-repeat="carrier in sms_carriers">
446 ng-click="user_settings['opac.default_sms_carrier'] = carrier">
455 <div class="row reg-field-row" ng-repeat="type in opt_in_setting_types">
456 <div class="col-md-3 reg-field-label">
457 <label>{{type.label()}}</label>
459 <div class="col-md-3 reg-field-input">
460 <input type='checkbox' ng-model="user_settings[type.name()]"/>
466 <div ng-repeat="addr in patron.addresses">
467 <div class="alert alert-success row" role="alert">
468 <div class="col-md-3">[% l('Address') %]</div>
469 <div class="col-md-3">
470 <span class='pad-all-min'>
471 [% l('Mailing') %] <input type='checkbox'
472 ng-change="set_addr_type(addr, 'mailing')"
473 ng-model="addr._is_mailing"/>
475 <span class='pad-all-min'>
476 [% l('Physical') %] <input type='checkbox'
477 ng-change="set_addr_type(addr, 'billing')"
478 ng-model="addr._is_billing"/>
480 <span class='pad-all-min'>
481 <button type="button" ng-click="delete_address(addr.id)"
482 class="btn btn-danger">[% l('X') %]</button>
487 [% formfield('aua', 'address_type', 'addresses[$index]') %]
488 [% formfield('aua', 'post_code', 'addresses[$index]') %]
489 [% formfield('aua', 'street1', 'addresses[$index]') %]
490 [% formfield('aua', 'street2', 'addresses[$index]') %]
491 [% formfield('aua', 'city', 'addresses[$index]') %]
492 [% formfield('aua', 'county', 'addresses[$index]') %]
493 [% formfield('aua', 'state', 'addresses[$index]') %]
494 [% formfield('aua', 'country', 'addresses[$index]') %]
495 [% formfield('aua', 'valid', 'addresses[$index]', 'checkbox') %]
496 [% formfield('aua', 'within_city_limits', 'addresses[$index]', 'checkbox') %]
498 <div class="row" ng-if="$last">
499 <button type="button" ng-click="new_address()"
500 class="btn btn-success">[% l('New Address') %]</button>
503 <!-- pending address -->
505 </div> <!-- addresses -->
507 <div class="alert alert-success row" role="alert"
508 ng-show="show_field('stat_cats')" ng-if="stat_cats.length > 0">
509 <div class="col-md-6">[% l('Statistical Categories') %]</div>
512 <div class="row reg-field-row"
513 ng-show="show_field('stat_cats')" ng-repeat="cat in stat_cats">
514 <div class="col-md-3 reg-field-label">
515 <label>{{cat.name()}}</label>
517 <div class="col-md-3 reg-field-input">
518 <div ng-if="cat.entries().length == 0">
519 <input type="text" class="form-control"/>
521 <div ng-if="cat.entries().length != 0">
522 <div class="btn-group" dropdown>
523 <button type="button" class="btn btn-default dropdown-toggle">
524 <span style="padding-right: 5px;">
525 {{stat_cat_entry_maps[cat.id()].value()}}</span>
526 <span class="caret"></span>
528 <ul class="dropdown-menu">
529 <li ng-repeat="entry in cat.entries()">
530 <a href ng-click="stat_cat_entry_maps[cat.id()]=entry">
542 <div class="alert alert-success row" role="alert"
543 ng-show="show_field('surveys')" ng-if="surveys.length > 0">
544 <div class="col-md-6">[% l('Surveys') %]</div>
547 <div class="row reg-field-row"
548 ng-show="show_field('surveys')" ng-repeat="survey in surveys">
549 <div class="col-md-3 reg-field-label">
550 <label>{{survey.name()}}</label>
552 <div class="col-md-6 reg-field-input">
553 <div class="row" ng-repeat="question in survey.questions()"
554 style="margin-bottom: 10px;">
555 <div class="col-md-6">{{question.question()}}</div>
556 <div class="col-md-6">
557 <div class="btn-group" dropdown>
558 <button type="button" class="btn btn-default dropdown-toggle">
559 <span style="padding-right: 5px;">
560 {{survey_responses[question.id()].answer()}}
562 <span class="caret"></span>
564 <ul class="dropdown-menu">
565 <li ng-repeat="answer in question.answers()">
566 <a href ng-click="survey_responses[question.id()] = answer">
577 </div><!-- /form wrapper -->