CAT-172 patron edit reordered
authorKatlyn Beck <kbeck@catalyte.io>
Thu, 7 Jun 2018 18:34:47 +0000 (18:34 +0000)
committerBill Erickson <berickxx@gmail.com>
Thu, 21 Mar 2019 19:46:23 +0000 (15:46 -0400)
Reordered patron edit form to match KCLS xul client ordering

--
Updates for current 3.2 applied by berick.

Signed-off-by: Katlyn Beck <kbeck@catalyte.io>
Changes to be committed:
modified:   Open-ILS/src/templates/staff/circ/patron/t_edit.tt2

Open-ILS/src/templates/staff/circ/patron/t_edit.tt2

index 3f95036..f6fbe8d 100644 (file)
@@ -156,63 +156,35 @@ within the "form" by name for validation.
 <div ng-form id="patron-reg-container" 
   name="reg_form" ng-show="page_data_loaded">
 
-<!-- BARCODE -->
+<!-- DOB -->
 
-<div class="row reg-field-row" ng-show="show_field('ac.barcode')">
-  [% draw_field_label('ac', 'barcode') %]
-  <div class="col-md-3 reg-field-input"> <!-- field form input -->
-      <input type="text" 
-        name="barcode"
-        ng-model="patron.card.barcode"
-        ng-pattern="field_pattern('ac', 'barcode')"
-        ng-required="field_required('ac', 'barcode')"
-        focus-me="focus_bc"
-        ng-change="field_modified()" 
-        ng-disabled="disable_bc"
-        class="form-control" 
-        ng-blur="handle_field_changed(patron.card, 'barcode')"/>
+<div class="row reg-field-row" ng-show="show_field('au.dob')">
+  [% draw_field_label('au', 'dob') %]
+  <div class="col-md-3 reg-field-input">
+    <eg-date-input ng-required="field_required('au', 'dob')" ng-model="patron.dob">
+    </eg-date-input>
   </div>
   <div class="col-md-6 patron-reg-example">
-      <button class="btn btn-default" ng-show="!patron.isnew"
-        ng-click="replace_card()">[% l('Replace Barcode') %]</button>
-      <button class="btn btn-default" ng-if="!patron.isnew" 
-        ng-click="cards_dialog()">[% l('See All') %]</button>
-      <div ng-show="dupe_barcode" class="patron-reg-validation-alert">
-        <span>[% l('Barcode is already in use') %]</span>
-      </div>
+    [% draw_example_text('au', 'dob') %]
   </div>
 </div>
 
-<!-- USRNAME -->
+  <!-- JUVENILE -->
 
-<div class="row reg-field-row" ng-show="show_field('au.usrname')">
-  [% draw_field_label('au', 'usrname') %]
+<div class="row reg-field-row" ng-show="show_field('au.juvenile')">
+  [% draw_field_label('au', 'juvenile') %]
   <div class="col-md-3 reg-field-input">
-    <input type="text" 
-      name='usrname'
-      ng-required="field_required('au', 'usrname')"
-      focus-me="focus_usrname"
-      ng-change="field_modified()" 
-      ng-pattern="field_pattern('au', 'usrname')"
-      ng-blur="handle_field_changed(patron, 'usrname')"
-      class="form-control" 
-      ng-model="patron.usrname"/>
-  </div>
-  <div class="col-md-6 patron-reg-example">
-    <div ng-show="dupe_username" class="patron-reg-validation-alert">
-      <span>[% l('Username is already in use') %]</span>
-    </div>
+    <input ng-change="field_modified()" ng-blur="handle_field_changed(patron, 'juvenile')" type='checkbox' ng-model="patron.juvenile"
+    />
   </div>
 </div>
 
-<!-- PASSWD -->
+<!-- PREFIX -->
 
-<div class="row reg-field-row" ng-show="show_field('au.passwd')">
-  [% draw_field_label('au', 'passwd') %]
-  [% draw_form_input('au', 'passwd'); %]
+<div class="row reg-field-row" ng-show="show_field('au.prefix')">
+  [% draw_field_label('au', 'prefix') %] [% draw_form_input('au', 'prefix'); %]
   <div class="col-md-6 patron-reg-example">
-    <button class="btn btn-default" ng-click="generate_password()">
-      [% l('Generate Password') %]</button>
+    [% draw_example_text('au', 'prefix') %]
   </div>
 </div>
 
@@ -226,9 +198,6 @@ within the "form" by name for validation.
         <a ng-click="name_tab='preferred'">[% l('Preferred Name') %]</a>
       </li>
     </ul>
-  </div>
-</div>
-
 <div ng-show="name_tab == 'primary'">
 
   <!-- PREFIX -->
@@ -241,6 +210,15 @@ within the "form" by name for validation.
     </div>
   </div>
 
+  <!-- FAMILY_NAME -->
+
+  <div class="row reg-field-row" ng-show="show_field('au.family_name')">
+    [% draw_field_label('au', 'family_name') %] [% draw_form_input('au', 'family_name'); %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('au', 'family_name') %]
+    </div>
+  </div>
+
   <!-- FIRST_GIVEN_NAME -->
 
   <div class="row reg-field-row" ng-show="show_field('au.first_given_name')">
@@ -249,7 +227,6 @@ within the "form" by name for validation.
     <div class="col-md-6 patron-reg-example">
       [% draw_example_text('au', 'first_given_name') %]
     </div>
-  </div>
 
   <!-- SECOND_GIVEN_NAME -->
 
@@ -261,16 +238,6 @@ within the "form" by name for validation.
     </div>
   </div>
 
-  <!-- FAMILY_NAME -->
-
-  <div class="row reg-field-row" ng-show="show_field('au.family_name')">
-    [% draw_field_label('au', 'family_name') %]
-    [% draw_form_input('au', 'family_name'); %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('au', 'family_name') %]
-    </div>
-  </div>
-
   <!-- SUFFIX -->
 
   <div class="row reg-field-row" ng-show="show_field('au.suffix')">
@@ -294,6 +261,16 @@ within the "form" by name for validation.
     </div>
   </div>
 
+  <!-- FAMILY_NAME -->
+
+  <div class="row reg-field-row" ng-show="show_field('au.pref_family_name')">
+    [% draw_field_label('au', 'pref_family_name') %]
+    [% draw_form_input('au', 'pref_family_name'); %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('au', 'pref_family_name') %]
+    </div>
+  </div>
+
   <!-- FIRST_GIVEN_NAME -->
 
   <div class="row reg-field-row" ng-show="show_field('au.pref_first_given_name')">
@@ -314,16 +291,6 @@ within the "form" by name for validation.
     </div>
   </div>
 
-  <!-- FAMILY_NAME -->
-
-  <div class="row reg-field-row" ng-show="show_field('au.pref_family_name')">
-    [% draw_field_label('au', 'pref_family_name') %]
-    [% draw_form_input('au', 'pref_family_name'); %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('au', 'pref_family_name') %]
-    </div>
-  </div>
-
   <!-- SUFFIX -->
 
   <div class="row reg-field-row" ng-show="show_field('au.pref_suffix')">
@@ -359,130 +326,194 @@ within the "form" by name for validation.
 <!-- ALIAS -->
 
 <div class="row reg-field-row" ng-show="show_field('au.alias')">
-  [% draw_field_label('au', 'alias') %]
-  [% draw_form_input('au', 'alias'); %]
+  [% draw_field_label('au', 'alias') %] [% draw_form_input('au', 'alias'); %]
   <div class="col-md-6 patron-reg-example">
     [% draw_example_text('au', 'alias') %]
   </div>
 </div>
 
-<!-- DOB -->
+<!-- addresses -->
 
-<div class="row reg-field-row" ng-show="show_field('au.dob')">
-  [% draw_field_label('au', 'dob') %]
-  <div class="col-md-3 reg-field-input">
-    <eg-date-input
-      ng-required="field_required('au', 'dob')" 
-      ng-model="patron.dob">
-    </eg-date-input>
+<div ng-repeat="addr in patron.addresses">
+  <div class="alert alert-success row" role="alert">
+    <div class="col-md-3">
+      [% l('Address') %]
+      <div ng-show="addr._linked_owner">
+        (
+        <a target="_blank" href="/eg/staff/circ/patron/{{addr._linked_owner_id}}/edit">
+          [% l('Owned by [_1]', '{{addr._linked_owner}}') %]
+        </a>)
+      </div>
+    </div>
+    <div class="col-md-3">
+      <span class='pad-all-min'>
+        [% l('Mailing') %]
+        <input type='checkbox' ng-change="field_modified();set_addr_type(addr, 'mailing')" ng-model="addr._is_mailing"
+        />
+      </span>
+      <span class='pad-all-min'>
+        [% l('Physical') %]
+        <input type='checkbox' ng-change="field_modified();set_addr_type(addr, 'billing')" ng-model="addr._is_billing"
+        />
+      </span>
+      <span class='pad-all-min'>
+        <button type="button" ng-click="field_modified();delete_address(addr.id)" class="btn btn-danger">[% l('X') %]</button>
+      </span>
+    </div>
   </div>
-  <div class="col-md-6 patron-reg-example">
-    [% draw_example_text('au', 'dob') %]
+
+  <div ng-if="addr.pending" class="row">
+    <div class="col-md-6 patron-reg-pending-address">
+      <div class="row">
+        <div class="col-md-6">
+          [% l('This is a pending address') %]
+        </div>
+        <div class="col-md-6">
+          <button class="btn btn-success" 
+            ng-click="approve_pending_address(addr)">[% l('Approve') %]</button>
+        </div>
+      </div>
+      <div class="row" ng-if="addr._replaces">
+        <div class="col-md-6">
+          [% | l(
+            '{{addr._replaces.street1}}',
+            '{{addr._replaces.street2}}',
+            '<br/>'
+            '{{addr._replaces.city}}',
+            '{{addr._replaces.state}}',
+            '{{addr._replaces.post_code}}') %]
+            Replaces: [_1] [_2] [_3] [_4], [_5] [_6]
+          [% END %]
+        </div>
+      </div>
+    </div>
+    <!-- make sure we occupy the entire row -->
+    <div class="col-md-6"> </div>
+  </div>
+
+  <!-- ADDRESS_TYPE -->
+  <div class="row reg-field-row" ng-show="show_field('aua.address_type')">
+    [% draw_field_label('aua', 'address_type') %] [% draw_form_input('aua', 'address_type', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'address_type') %]
+    </div>
   </div>
-</div>
 
-<!-- JUVENILE -->
+  <!-- POST_CODE -->
 
-<div class="row reg-field-row" ng-show="show_field('au.juvenile')">
-  [% draw_field_label('au', 'juvenile') %]
-  <div class="col-md-3 reg-field-input">
-      <input 
-        ng-change="field_modified()" 
-        ng-blur="handle_field_changed(patron, 'juvenile')"
-        type='checkbox' ng-model="patron.juvenile"/>
+  <div class="row reg-field-row" ng-show="show_field('aua.post_code')">
+    [% draw_field_label('aua', 'post_code') %] [% draw_form_input('aua', 'post_code', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'post_code') %]
+    </div>
   </div>
-</div>
 
-<!-- ident_type -->
+  <!-- STREET1 -->
 
-<div class="row reg-field-row" ng-show="show_field('au.ident_type')">
-  [% draw_field_label('au', 'ident_type') %]
-  <div class="col-md-3 reg-field-input">
-    <select 
-      class="form-control" 
-      ng-model="patron.ident_type"
-      ng-required="field_required('au', 'ident_type')"
-      ng-blur="handle_field_changed(patron, 'ident_type')"
-      ng-options="type.name() for type in ident_types track by type.id()">
-    </select>
+  <div class="row reg-field-row" ng-show="show_field('aua.street1')">
+    [% draw_field_label('aua', 'street1') %] [% draw_form_input('aua', 'street1', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'street1') %]
+    </div>
   </div>
-</div>
 
-<!-- IDENT_VALUE -->
+  <!-- STREET2 -->
 
-<div class="row reg-field-row" ng-show="show_field('au.ident_value')">
-  [% draw_field_label('au', 'ident_value') %]
-  [% draw_form_input('au', 'ident_value') %]
-  <div class="col-md-6 patron-reg-example">
-    [% draw_example_text('au', 'ident_value') %]
+  <div class="row reg-field-row" ng-show="show_field('aua.street2')">
+    [% draw_field_label('aua', 'street2') %] [% draw_form_input('aua', 'street2', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'street2') %]
+    </div>
   </div>
-</div>
 
-<!-- ident_type2 -->
+  <!-- CITY -->
 
-<div class="row reg-field-row" ng-show="show_field('au.ident_type2')">
-  [% draw_field_label('au', 'ident_type2') %]
-  <div class="col-md-3 reg-field-input">
-    <select 
-      class="form-control" 
-      ng-model="patron.ident_type2"
-      ng-required="field_required('au', 'ident_type2')"
-      ng-blur="handle_field_changed(patron, 'ident_type2')"
-      ng-options="type.name() for type in ident_types track by type.id()">
-    </select>
+  <div class="row reg-field-row" ng-show="show_field('aua.city')">
+    [% draw_field_label('aua', 'city') %] [% draw_form_input('aua', 'city', 'addresses[$index]', '', 'addr._linked_owner') %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'city') %]
+    </div>
   </div>
-</div>
 
-<!-- IDENT_VALUE2 -->
-<div class="row reg-field-row" ng-show="show_field('au.ident_value2')">
-  [% draw_field_label('au', 'ident_value2') %]
-  [% draw_form_input('au', 'ident_value2') %]
-  <div class="col-md-6 patron-reg-example">
-    [% draw_example_text('au', 'ident_value2') %]
+  <!-- COUNTY -->
+
+  <div class="row reg-field-row" ng-show="show_field('aua.county')">
+    [% draw_field_label('aua', 'county') %] [% draw_form_input('aua', 'county', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'county') %]
+    </div>
   </div>
-</div>
 
+  <!-- STATE -->
 
-<!-- EMAIL -->
-<div class="row reg-field-row" ng-show="show_field('au.email')">
-  [% draw_field_label('au', 'email') %]
-  [% draw_form_input('au', 'email', '', 'email') %]
-  <div class="col-md-6 patron-reg-example">
-    <button ng-show="patron.email && !patron.isnew" 
-      class="btn btn-default" 
-      ng-click="invalidate_field('email')">[% l('Invalidate') %]</button>
-    <span ng-if="org_settings['ui.patron.edit.au.email.example']">
-      [% l('Example: [_1]',
-        "{{org_settings['ui.patron.edit.au.email.example']}}") %]
-    </span>
+  <div class="row reg-field-row" ng-show="show_field('aua.state')">
+    [% draw_field_label('aua', 'state') %] [% draw_form_input('aua', 'state', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'state') %]
+    </div>
   </div>
-</div>
 
-<div class="row reg-field-row" ng-show="show_field('au.email') && opt_in_setting_types['circ.send_email_checkout_receipts']">
-  <div class="col-md-3 reg-field-label">
-    <label>{{opt_in_setting_types['circ.send_email_checkout_receipts'].label()}}</label>
+  <!-- COUNTRY -->
+
+  <div class="row reg-field-row" ng-show="show_field('aua.country')">
+    [% draw_field_label('aua', 'country') %] [% draw_form_input('aua', 'country', 'addresses[$index]', '', 'addr._linked_owner')
+    %]
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'country') %]
+    </div>
   </div>
-  <div class="col-md-3 reg-field-input">
-    <input
-      ng-change="field_modified()"
-      type='checkbox' ng-model="user_settings['circ.send_email_checkout_receipts']"/>
+
+  <!-- VALID -->
+
+  <div class="row reg-field-row" ng-show="show_field('aua.valid')">
+    [% draw_field_label('aua', 'valid') %]
+    <div class="col-md-3 reg-field-input">
+      <input type='checkbox' ng-change="field_modified()" ng-disabled='addr._linked_owner' ng-blur="handle_field_changed(patron.addresses[$index], 'valid')"
+        ng-model="patron.addresses[$index].valid" />
+    </div>
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'valid') %]
+    </div>
   </div>
+
+  <!-- WITHIN_CITY_LIMITS -->
+
+  <div class="row reg-field-row" ng-show="show_field('aua.within_city_limits')">
+    [% draw_field_label('aua', 'within_city_limits') %]
+    <div class="col-md-3 reg-field-input">
+      <input type='checkbox' ng-change="field_modified()" ng-disabled='addr._linked_owner' ng-blur="handle_field_changed(patron.addresses[$index], 'within_city_limits')"
+        ng-model="patron.addresses[$index].within_city_limits" />
+    </div>
+    <div class="col-md-6 patron-reg-example">
+      [% draw_example_text('aua', 'within_city_limits') %]
+    </div>
+  </div>
+
+  <!-- pending address -->
+
+</div>
+<!-- addresses -->
+
+<div class="row">
+  <button type="button" ng-click="new_address()" class="btn btn-success">[% l('New Address') %]</button>
 </div>
 
 <!-- DAY_PHONE -->
 
 <div class="row reg-field-row" ng-show="show_field('au.day_phone')">
-  [% draw_field_label('au', 'day_phone') %]
-  [% draw_form_input('au', 'day_phone') %]
+  [% draw_field_label('au', 'day_phone') %] [% draw_form_input('au', 'day_phone') %]
   <div class="col-md-6 patron-reg-example">
-    <button ng-show="patron.day_phone && !patron.isnew" 
-        class="btn btn-default" 
-        ng-click="invalidate_field('day_phone')">[% l('Invalidate') %]</button>
+    <button ng-show="patron.day_phone && !patron.isnew" class="btn btn-default" ng-click="invalidate_field('day_phone')">[% l('Invalidate') %]</button>
     [% draw_example_text('au', 'day_phone') %]
     <!-- phones have a fall-through example strings -->
     <span ng-if="!org_settings['ui.patron.edit.au.day_phone.example'] && org_settings['ui.patron.edit.phone.example']">
-      [% l('Example: [_1]', 
-        "{{org_settings['ui.patron.edit.phone.example']}}") %]
+      [% l('Example: [_1]', "{{org_settings['ui.patron.edit.phone.example']}}") %]
     </span>
   </div>
 </div>
@@ -490,17 +521,13 @@ within the "form" by name for validation.
 <!-- EVENING_PHONE -->
 
 <div class="row reg-field-row" ng-show="show_field('au.evening_phone')">
-  [% draw_field_label('au', 'evening_phone') %]
-  [% draw_form_input('au', 'evening_phone') %]
+  [% draw_field_label('au', 'evening_phone') %] [% draw_form_input('au', 'evening_phone') %]
   <div class="col-md-6 patron-reg-example">
-    <button ng-show="patron.evening_phone && !patron.isnew" 
-        class="btn btn-default" 
-        ng-click="invalidate_field('evening_phone')">[% l('Invalidate') %]</button>
+    <button ng-show="patron.evening_phone && !patron.isnew" class="btn btn-default" ng-click="invalidate_field('evening_phone')">[% l('Invalidate') %]</button>
     [% draw_example_text('au', 'evening_phone') %]
     <!-- phones have a fall-through example strings -->
     <span ng-if="!org_settings['ui.patron.edit.au.evening_phone.example'] && org_settings['ui.patron.edit.phone.example']">
-      [% l('Example: [_1]', 
-        "{{org_settings['ui.patron.edit.phone.example']}}") %]
+      [% l('Example: [_1]', "{{org_settings['ui.patron.edit.phone.example']}}") %]
     </span>
   </div>
 </div>
@@ -508,30 +535,43 @@ within the "form" by name for validation.
 <!-- OTHER_PHONE -->
 
 <div class="row reg-field-row" ng-show="show_field('au.other_phone')">
-  [% draw_field_label('au', 'other_phone') %]
-  [% draw_form_input('au', 'other_phone') %]
+  [% draw_field_label('au', 'other_phone') %] [% draw_form_input('au', 'other_phone') %]
   <div class="col-md-6 patron-reg-example">
-    <button ng-show="patron.other_phone && !patron.isnew" 
-        class="btn btn-default" 
-        ng-click="invalidate_field('other_phone')">[% l('Invalidate') %]</button>
+    <button ng-show="patron.other_phone && !patron.isnew" class="btn btn-default" ng-click="invalidate_field('other_phone')">[% l('Invalidate') %]</button>
     [% draw_example_text('au', 'other_phone') %]
     <!-- phones have a fall-through example strings -->
     <span ng-if="!org_settings['ui.patron.edit.au.other_phone.example'] && org_settings['ui.patron.edit.phone.example']">
-      [% l('Example: [_1]', 
-        "{{org_settings['ui.patron.edit.phone.example']}}") %]
+      [% l('Example: [_1]', "{{org_settings['ui.patron.edit.phone.example']}}") %]
+    </span>
+  </div>
+</div>
+
+<!-- EMAIL -->
+<div class="row reg-field-row" ng-show="show_field('au.email')">
+  [% draw_field_label('au', 'email') %] [% draw_form_input('au', 'email', '', 'email') %]
+  <div class="col-md-6 patron-reg-example">
+    <button ng-show="patron.email && !patron.isnew" class="btn btn-default" ng-click="invalidate_field('email')">[% l('Invalidate') %]</button>
+    <span ng-if="org_settings['ui.patron.edit.au.email.example']">
+      [% l('Example: [_1]', "{{org_settings['ui.patron.edit.au.email.example']}}") %]
     </span>
   </div>
 </div>
 
+<div class="row reg-field-row" ng-show="show_field('au.email') && opt_in_setting_types['circ.send_email_checkout_receipts']">
+  <div class="col-md-3 reg-field-label">
+    <label>{{opt_in_setting_types['circ.send_email_checkout_receipts'].label()}}</label>
+  </div>
+  <div class="col-md-3 reg-field-input">
+    <input ng-change="field_modified()" type='checkbox' ng-model="user_settings['circ.send_email_checkout_receipts']" />
+  </div>
+</div>
+
 <!-- home org unit selector -->
 
 <div class="row reg-field-row" ng-show="show_field('au.home_ou')">
   [% draw_field_label('au', 'home_ou') %]
   <div class="col-md-3 reg-field-input">
-    <eg-org-selector 
-      selected="patron.home_ou" 
-      onchange="handle_home_org_changed"
-      disable-test="disable_home_org">
+    <eg-org-selector selected="patron.home_ou" onchange="handle_home_org_changed" disable-test="disable_home_org">
     </eg-org-selector>
   </div>
 </div>
@@ -542,8 +582,7 @@ within the "form" by name for validation.
   [% draw_field_label('au', 'profile') %]
   <div class="col-md-3 reg-field-input">
     <div class="btn-group" uib-dropdown>
-      <button type="button" class="btn btn-default" uib-dropdown-toggle
-          ng-class="{'ng-invalid' : invalid_profile()}">
+      <button type="button" class="btn btn-default" uib-dropdown-toggle ng-class="{'ng-invalid' : invalid_profile()}">
         <span style="padding-right: 5px;">
           {{patron.profile.name() || "[% l('Profile Group') %]"}}
         </span>
@@ -566,16 +605,14 @@ within the "form" by name for validation.
     </div>
   </div>
   <div class="col-md-3">
-    <button class="btn btn-default" ng-if="!offline" ng-disabled="!perms.CREATE_USER_GROUP_LINK"
-      ng-click="secondary_groups_dialog()">[% l('Secondary Groups') %]</button>
-  </div> 
+    <button class="btn btn-default" ng-if="!offline" ng-disabled="!perms.CREATE_USER_GROUP_LINK" ng-click="secondary_groups_dialog()">[% l('Secondary Groups') %]</button>
+  </div>
 </div>
 
 <div class="row reg-field-row" ng-show="show_field('au.expire_date')">
   [% draw_field_label('au', 'expire_date') %]
   <div class="col-md-3 reg-field-input">
-    <eg-date-input 
-      ng-model="patron.expire_date">
+    <eg-date-input ng-model="patron.expire_date">
     </eg-date-input>
   </div>
   <div class="col-md-3">
@@ -589,11 +626,7 @@ within the "form" by name for validation.
 <div class="row reg-field-row" ng-show="show_field('au.net_access_level')">
   [% draw_field_label('au', 'net_access_level') %]
   <div class="col-md-3 reg-field-input">
-    <select 
-      class="form-control" 
-      ng-model="patron.net_access_level"
-      ng-required="field_required('au', 'net_access_level')"
-      ng-blur="handle_field_changed(patron, 'net_access_level')"
+    <select class="form-control" ng-model="patron.net_access_level" ng-required="field_required('au', 'net_access_level')" ng-blur="handle_field_changed(patron, 'net_access_level')"
       ng-options="level.name() for level in net_access_levels track by level.id()">
     </select>
   </div>
@@ -604,10 +637,8 @@ within the "form" by name for validation.
 <div class="row reg-field-row" ng-show="show_field('au.active')">
   [% draw_field_label('au', 'active') %]
   <div class="col-md-3 reg-field-input">
-      <input 
-        ng-change="field_modified()" 
-        ng-blur="handle_field_changed(patron, 'active')"
-        type='checkbox' ng-model="patron.active"/>
+    <input ng-change="field_modified()" ng-blur="handle_field_changed(patron, 'active')" type='checkbox' ng-model="patron.active"
+    />
   </div>
 </div>
 
@@ -616,10 +647,8 @@ within the "form" by name for validation.
 <div class="row reg-field-row" ng-show="show_field('au.barred')">
   [% draw_field_label('au', 'barred') %]
   <div class="col-md-3 reg-field-input">
-      <input 
-        ng-change="field_modified()" 
-        ng-blur="handle_field_changed(patron, 'barred')"
-        type='checkbox' ng-model="patron.barred"/>
+    <input ng-change="field_modified()" ng-blur="handle_field_changed(patron, 'barred')" type='checkbox' ng-model="patron.barred"
+    />
   </div>
 </div>
 
@@ -628,19 +657,16 @@ within the "form" by name for validation.
 <div class="row reg-field-row" ng-show="show_field('au.master_account')">
   [% draw_field_label('au', 'master_account') %]
   <div class="col-md-3 reg-field-input">
-      <input 
-        ng-change="field_modified()" 
-        ng-blur="handle_field_changed(patron, 'master_account')"
-        type='checkbox' ng-model="patron.master_account"/>
+    <input ng-change="field_modified()" ng-blur="handle_field_changed(patron, 'master_account')" type='checkbox' ng-model="patron.master_account"
+    />
   </div>
 </div>
 
 <!-- CLAIMS_RETURNED_COUNT -->
 
 <div class="row reg-field-row" ng-show="show_field('au.claims_returned_count')">
-  [% draw_field_label('au', 'claims_returned_count') %]
-  [% draw_form_input('au', 'claims_returned_count', 
-    '', 'number', '!perms.UPDATE_PATRON_CLAIM_RETURN_COUNT') %]
+  [% draw_field_label('au', 'claims_returned_count') %] [% draw_form_input('au', 'claims_returned_count', '', 'number', '!perms.UPDATE_PATRON_CLAIM_RETURN_COUNT')
+  %]
   <div class="col-md-6 patron-reg-example">
     [% draw_example_text('au', 'claims_returned_count') %]
   </div>
@@ -649,9 +675,8 @@ within the "form" by name for validation.
 <!-- CLAIMS_NEVER_CHECKED_OUT_COUNT -->
 
 <div class="row reg-field-row" ng-show="show_field('au.claims_never_checked_out_count')">
-  [% draw_field_label('au', 'claims_never_checked_out_count') %]
-  [% draw_form_input('au', 'claims_never_checked_out_count',
-    '', 'number', '!perms.UPDATE_PATRON_CLAIM_NEVER_CHECKED_OUT_COUNT') %]
+  [% draw_field_label('au', 'claims_never_checked_out_count') %] [% draw_form_input('au', 'claims_never_checked_out_count',
+  '', 'number', '!perms.UPDATE_PATRON_CLAIM_NEVER_CHECKED_OUT_COUNT') %]
   <div class="col-md-6 patron-reg-example">
     [% draw_example_text('au', 'claims_never_checked_out_count') %]
   </div>
@@ -662,11 +687,7 @@ within the "form" by name for validation.
 <div class="row reg-field-row" ng-show="show_field('au.alert_message')">
   [% draw_field_label('au', 'alert_message') %]
   <div class="col-md-3 reg-field-input">
-    <textarea 
-      class="form-control" 
-      ng-model="patron.alert_message"
-      ng-pattern="field_pattern('au', 'alert_message')"
-      ng-change="field_modified()" 
+    <textarea class="form-control" ng-model="patron.alert_message" ng-pattern="field_pattern('au', 'alert_message')" ng-change="field_modified()"
       ng-blur="handle_field_changed(patron, 'alert_message')">
     </textarea>
   </div>
@@ -677,315 +698,193 @@ within the "form" by name for validation.
 
 <div ng-if="!offline">
 
-<div class="alert alert-success row" role="alert">
-  <div class="col-md-6">[% l('User Settings') %]</div>
-</div>
-
-<div class="row reg-field-row">
-  <div class="col-md-3 reg-field-label">
-    <label>{{user_setting_types['opac.default_phone'].label()}}</label>
-  </div>
-  <div class="col-md-3 reg-field-input">
-    <input 
-      ng-change="field_modified()" 
-      type='text' ng-model="user_settings['opac.default_phone']"/>
-  </div>
-</div>
-
-<div class="row reg-field-row">
-  <div class="col-md-3 reg-field-label">
-    <label>{{user_setting_types['opac.default_pickup_location'].label()}}</label>
-  </div>
-  <div class="col-md-3 reg-field-input">
-    <eg-org-selector nodefault
-      disable-test="disable_pulib" 
-      selected="patron._pickup_lib"
-      onchange="handle_pulib_changed">
-    </eg-org-selector>
-  </div>
-</div>
-
-<div class="row reg-field-row" 
-    ng-if="org_settings['circ.holds.behind_desk_pickup_supported']">
-  <div class="col-md-3 reg-field-label">
-    <label>{{user_setting_types['circ.holds_behind_desk'].label()}}</label>
-  </div>
-  <div class="col-md-3 reg-field-input">
-      <input 
-        ng-change="field_modified()" 
-        type='checkbox' ng-model="user_settings['circ.holds_behind_desk']"/>
-  </div>
-</div>
-
-<!-- TODO: Add circ.collections.exempt to master SQL seed data -->
-<div class="row reg-field-row" 
-  ng-if="user_setting_types['circ.collections.exempt']">
-  <div class="col-md-3 reg-field-label">
-    <label>{{user_setting_types['circ.collections.exempt'].label()}}</label>
-  </div>
-  <div class="col-md-3 reg-field-input">
-      <input 
-        type='checkbox' 
-        ng-change="field_modified()" 
-        ng-disabled="!perms.UPDATE_PATRON_COLLECTIONS_EXEMPT"
-        ng-model="user_settings['circ.collections.exempt']"/>
+  <div class="alert alert-success row" role="alert">
+    <div class="col-md-6">[% l('User Settings') %]</div>
   </div>
-</div>
 
-<div class="row reg-field-row">
-  <div class="col-md-3 reg-field-label">
-    <label>[% l('Holds Notices') %]</label>
-  </div>
-  <div class="col-md-3 reg-field-input flex-row">
-    <div class='flex-cell'>
-      <input 
-        ng-change="field_modified()" 
-        type='checkbox' ng-model="hold_notify_type.phone"/>
-      [% l('Phone') %]
-    </div>
-    <div class='flex-cell'>
-      <input 
-        ng-change="field_modified()" 
-        type='checkbox' ng-model="hold_notify_type.email"/>
-      [% l('Email') %]
+  <div class="row reg-field-row">
+    <div class="col-md-3 reg-field-label">
+      <label>{{user_setting_types['opac.default_phone'].label()}}</label>
     </div>
-    <div class='flex-cell' ng-if="org_settings['sms.enable']">
-      <input 
-        ng-change="field_modified()" 
-        type='checkbox' ng-model="hold_notify_type.sms"/>
-      [% l('SMS') %]
+    <div class="col-md-3 reg-field-input">
+      <input ng-change="field_modified()" type='text' ng-model="user_settings['opac.default_phone']" />
     </div>
   </div>
-</div>
 
-<div class="row reg-field-row" ng-if="org_settings['sms.enable']">
-  <div class="col-md-3 reg-field-label">
-    <label>[% l('Default SMS/Text Number') %]</label>
-  </div>
-  <div class="col-md-3 reg-field-input">
-    <input 
-      ng-change="field_modified()" ng-model="user_settings['opac.default_sms_notify']"
-      type='text'/>
+  <div class="row reg-field-row">
+    <div class="col-md-3 reg-field-label">
+      <label>{{user_setting_types['opac.default_pickup_location'].label()}}</label>
+    </div>
+    <div class="col-md-3 reg-field-input">
+      <eg-org-selector nodefault disable-test="disable_pulib" selected="patron._pickup_lib" onchange="handle_pulib_changed">
+      </eg-org-selector>
+    </div>
   </div>
-</div>
 
-<div class="row reg-field-row" ng-if="org_settings['sms.enable']">
-  <div class="col-md-3 reg-field-label">
-    <label>[% l('Default SMS Carrier') %]</label>
-  </div>
-  <div class="col-md-3 reg-field-input">
-    <span class="nullable">
-      <select str-to-int class="form-control" ng-model="user_settings['opac.default_sms_carrier']" ng-options="c.id() as c.name() for c in sms_carriers">
-        <option value="">Select a Carrier</option>
-      </select>
-    </span>
+  <div class="row reg-field-row" ng-if="org_settings['circ.holds.behind_desk_pickup_supported']">
+    <div class="col-md-3 reg-field-label">
+      <label>{{user_setting_types['circ.holds_behind_desk'].label()}}</label>
+    </div>
+    <div class="col-md-3 reg-field-input">
+      <input ng-change="field_modified()" type='checkbox' ng-model="user_settings['circ.holds_behind_desk']" />
+    </div>
   </div>
-</div>
 
-<div class="row reg-field-row" ng-repeat="type in opt_in_setting_types">
-  <div class="col-md-3 reg-field-label" ng-if="type.name() != 'circ.send_email_checkout_receipts'">
-    <label>{{type.label()}}</label>
-  </div>
-  <div class="col-md-3 reg-field-input" ng-if="type.name() != 'circ.send_email_checkout_receipts'">
-    <input 
-      ng-change="field_modified()" 
-      type='checkbox' ng-model="user_settings[type.name()]"/>
+  <!-- TODO: Add circ.collections.exempt to master SQL seed data -->
+  <div class="row reg-field-row" ng-if="user_setting_types['circ.collections.exempt']">
+    <div class="col-md-3 reg-field-label">
+      <label>{{user_setting_types['circ.collections.exempt'].label()}}</label>
+    </div>
+    <div class="col-md-3 reg-field-input">
+      <input type='checkbox' ng-change="field_modified()" ng-disabled="!perms.UPDATE_PATRON_COLLECTIONS_EXEMPT" ng-model="user_settings['circ.collections.exempt']"
+      />
+    </div>
   </div>
-</div>
-
-</div> <!-- end offline test -->
-
-<!-- addresses -->
 
-<div ng-repeat="addr in patron.addresses">
-  <div class="alert alert-success row" role="alert">
-      <div class="col-md-3">
-        [% l('Address') %]
-        <div ng-show="addr._linked_owner">
-          (<a target="_blank"
-            href="/eg/staff/circ/patron/{{addr._linked_owner_id}}/edit">
-            [% l('Owned by [_1]', '{{addr._linked_owner}}') %]
-          </a>)
-        </div>
+  <div class="row reg-field-row">
+    <div class="col-md-3 reg-field-label">
+      <label>[% l('Holds Notices') %]</label>
+    </div>
+    <div class="col-md-3 reg-field-input flex-row">
+      <div class='flex-cell'>
+        <input ng-change="field_modified()" type='checkbox' ng-model="hold_notify_type.phone" /> [% l('Phone') %]
       </div>
-      <div class="col-md-3">
-          <span class='pad-all-min'>
-            [% l('Mailing') %] <input type='checkbox' 
-              ng-change="field_modified();set_addr_type(addr, 'mailing')" 
-              ng-model="addr._is_mailing"/>
-          </span>
-          <span class='pad-all-min'>
-            [% l('Physical') %] <input type='checkbox' 
-              ng-change="field_modified();set_addr_type(addr, 'billing')" 
-              ng-model="addr._is_billing"/>
-          </span>
-          <span class='pad-all-min'>
-            <button type="button" 
-              ng-click="field_modified();delete_address(addr.id)" 
-              class="btn btn-danger">[% l('X') %]</button>
-          </span>
+      <div class='flex-cell'>
+        <input ng-change="field_modified()" type='checkbox' ng-model="hold_notify_type.email" /> [% l('Email') %]
       </div>
-  </div>
-
-  <div ng-if="addr.pending" class="row">
-    <div class="col-md-6 patron-reg-pending-address">
-      <div class="row">
-        <div class="col-md-6">
-          [% l('This is a pending address') %]
-        </div>
-        <div class="col-md-6">
-          <button class="btn btn-success" 
-            ng-click="approve_pending_address(addr)">[% l('Approve') %]</button>
-        </div>
+      <div class='flex-cell' ng-if="org_settings['sms.enable']">
+        <input ng-change="field_modified()" type='checkbox' ng-model="hold_notify_type.sms" /> [% l('SMS') %]
       </div>
-      <div class="row" ng-if="addr._replaces">
-        <div class="col-md-6">
-          [% | l(
-            '{{addr._replaces.street1}}',
-            '{{addr._replaces.street2}}',
-            '<br/>'
-            '{{addr._replaces.city}}',
-            '{{addr._replaces.state}}',
-            '{{addr._replaces.post_code}}') %]
-            Replaces: [_1] [_2] [_3] [_4], [_5] [_6]
-          [% END %]
-        </div>
-      </div>
-    </div>
-    <!-- make sure we occupy the entire row -->
-    <div class="col-md-6"> </div>
+     </div>
   </div>
 
-  <!-- ADDRESS_TYPE -->
-  <div class="row reg-field-row" ng-show="show_field('aua.address_type')">
-    [% draw_field_label('aua', 'address_type') %]
-    [% draw_form_input('aua', 
-      'address_type', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'address_type') %]
+  <div class="row reg-field-row" ng-if="org_settings['sms.enable']">
+    <div class="col-md-3 reg-field-label">
+      <label>[% l('Default SMS/Text Number') %]</label>
     </div>
-  </div>
-
-  <!-- POST_CODE -->
-
-  <div class="row reg-field-row" ng-show="show_field('aua.post_code')">
-    [% draw_field_label('aua', 'post_code') %]
-    [% draw_form_input('aua', 
-      'post_code', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'post_code') %]
+    <div class="col-md-3 reg-field-input">
+      <input ng-change="field_modified()" ng-model="user_settings['opac.default_sms_notify']" type='text' />
     </div>
   </div>
 
-  <!-- STREET1 -->
-
-  <div class="row reg-field-row" ng-show="show_field('aua.street1')">
-    [% draw_field_label('aua', 'street1') %]
-    [% draw_form_input('aua', 
-      'street1', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'street1') %]
+  <div class="row reg-field-row" ng-if="org_settings['sms.enable']">
+    <div class="col-md-3 reg-field-label">
+      <label>[% l('Default SMS Carrier') %]</label>
+    </div>
+    <div class="col-md-3 reg-field-input">
+      <span class="nullable">
+        <select class="form-control" ng-model="user_settings['opac.default_sms_carrier']" ng-options="c.id() as c.name() for c in sms_carriers">
+          <option value="">Select a Carrier</option>
+        </select>
+      </span>
     </div>
   </div>
 
-  <!-- STREET2 -->
-
-  <div class="row reg-field-row" ng-show="show_field('aua.street2')">
-    [% draw_field_label('aua', 'street2') %]
-    [% draw_form_input('aua', 
-      'street2', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'street2') %]
+  <div class="row reg-field-row" ng-repeat="type in opt_in_setting_types">
+    <div class="col-md-3 reg-field-label" ng-if="type.name() != 'circ.send_email_checkout_receipts'">
+      <label>{{type.label()}}</label>
+    </div>
+    <div class="col-md-3 reg-field-input" ng-if="type.name() != 'circ.send_email_checkout_receipts'">
+      <input ng-change="field_modified()" type='checkbox' ng-model="user_settings[type.name()]" />
     </div>
   </div>
 
-  <!-- CITY -->
+</div>
+<!-- end offline test -->
 
-  <div class="row reg-field-row" ng-show="show_field('aua.city')">
-    [% draw_field_label('aua', 'city') %]
-    [% draw_form_input('aua', 
-      'city', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'city') %]
-    </div>
+<!-- ident_type -->
+
+<div class="row reg-field-row" ng-show="show_field('au.ident_type')">
+  [% draw_field_label('au', 'ident_type') %]
+  <div class="col-md-3 reg-field-input">
+    <select class="form-control" ng-model="patron.ident_type" ng-required="field_required('au', 'ident_type')" ng-blur="handle_field_changed(patron, 'ident_type')"
+      ng-options="type.name() for type in ident_types track by type.id()">
+    </select>
   </div>
+</div>
 
-  <!-- COUNTY -->
+<!-- IDENT_VALUE -->
 
-  <div class="row reg-field-row" ng-show="show_field('aua.county')">
-    [% draw_field_label('aua', 'county') %]
-    [% draw_form_input('aua', 
-      'county', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'county') %]
-    </div>
+<div class="row reg-field-row" ng-show="show_field('au.ident_value')">
+  [% draw_field_label('au', 'ident_value') %] [% draw_form_input('au', 'ident_value') %]
+  <div class="col-md-6 patron-reg-example">
+    [% draw_example_text('au', 'ident_value') %]
   </div>
+</div>
 
-  <!-- STATE -->
+<!-- ident_type2 -->
 
-  <div class="row reg-field-row" ng-show="show_field('aua.state')">
-    [% draw_field_label('aua', 'state') %]
-    [% draw_form_input('aua', 
-      'state', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'state') %]
-    </div>
+<div class="row reg-field-row" ng-show="show_field('au.ident_type2')">
+  [% draw_field_label('au', 'ident_type2') %]
+  <div class="col-md-3 reg-field-input">
+    <select class="form-control" ng-model="patron.ident_type2" ng-required="field_required('au', 'ident_type2')" ng-blur="handle_field_changed(patron, 'ident_type2')"
+      ng-options="type.name() for type in ident_types track by type.id()">
+    </select>
   </div>
+</div>
 
-  <!-- COUNTRY -->
-
-  <div class="row reg-field-row" ng-show="show_field('aua.country')">
-    [% draw_field_label('aua', 'country') %]
-    [% draw_form_input('aua', 
-      'country', 'addresses[$index]', '', 'addr._linked_owner') %]
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'country') %]
-    </div>
+<!-- IDENT_VALUE2 -->
+<div class="row reg-field-row" ng-show="show_field('au.ident_value2')">
+  [% draw_field_label('au', 'ident_value2') %] [% draw_form_input('au', 'ident_value2') %]
+  <div class="col-md-6 patron-reg-example">
+    [% draw_example_text('au', 'ident_value2') %]
   </div>
+</div>
 
-  <!-- VALID -->
+<!-- BARCODE -->
 
-  <div class="row reg-field-row" ng-show="show_field('aua.valid')">
-    [% draw_field_label('aua', 'valid') %]
-    <div class="col-md-3 reg-field-input">
-        <input 
-          type='checkbox' 
-          ng-change="field_modified()" 
-          ng-disabled='addr._linked_owner'
-          ng-blur="handle_field_changed(patron.addresses[$index], 'valid')"
-          ng-model="patron.addresses[$index].valid"/>
-    </div>
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'valid') %]
+<div class="row reg-field-row" ng-show="show_field('ac.barcode')">
+  [% draw_field_label('ac', 'barcode') %]
+  <div class="col-md-3 reg-field-input">
+    <!-- field form input -->
+    <input type="text" name="barcode" ng-model="patron.card.barcode" ng-pattern="field_pattern('ac', 'barcode')" ng-required="field_required('ac', 'barcode')"
+      focus-me="focus_bc" ng-change="field_modified()" ng-disabled="disable_bc" class="form-control" ng-blur="handle_field_changed(patron.card, 'barcode')"
+    />
+  </div>
+  <div class="col-md-6 patron-reg-example">
+    <button class="btn btn-default" ng-show="!patron.isnew" ng-click="replace_card()">[% l('Replace Barcode') %]</button>
+    <button class="btn btn-default" ng-if="!patron.isnew" ng-click="cards_dialog()">[% l('See All') %]</button>
+    <div ng-show="dupe_barcode" class="patron-reg-validation-alert">
+      <span>[% l('Barcode is already in use') %]</span>
     </div>
   </div>
+</div>
 
-  <!-- WITHIN_CITY_LIMITS -->
+<!-- USRNAME -->
 
-  <div class="row reg-field-row" ng-show="show_field('aua.within_city_limits')">
-    [% draw_field_label('aua', 'within_city_limits') %]
-    <div class="col-md-3 reg-field-input">
-        <input 
-          type='checkbox' 
-          ng-change="field_modified()" 
-          ng-disabled='addr._linked_owner'
-          ng-blur="handle_field_changed(patron.addresses[$index], 'within_city_limits')"
-          ng-model="patron.addresses[$index].within_city_limits"/>
-    </div>
-    <div class="col-md-6 patron-reg-example">
-      [% draw_example_text('aua', 'within_city_limits') %]
+<div class="row reg-field-row" ng-show="show_field('au.usrname')">
+  [% draw_field_label('au', 'usrname') %]
+  <div class="col-md-3 reg-field-input">
+    <input type="text" 
+      name='usrname'
+      ng-required="field_required('au', 'usrname')"
+      focus-me="focus_usrname"
+      ng-change="field_modified()" 
+      ng-pattern="field_pattern('au', 'usrname')"
+      ng-blur="handle_field_changed(patron, 'usrname')"
+      class="form-control" 
+      ng-model="patron.usrname"/>
+  </div>
+  <div class="col-md-6 patron-reg-example">
+    <div ng-show="dupe_username" class="patron-reg-validation-alert">
+      <span>[% l('Username is already in use') %]</span>
     </div>
   </div>
+</div>
 
-  <!-- pending address -->
-
-</div> <!-- addresses -->
+<!-- PASSWD -->
 
-<div class="row">
-  <button type="button" ng-click="new_address()" 
-    class="btn btn-success">[% l('New Address') %]</button>
+<div class="row reg-field-row" ng-show="show_field('au.passwd')">
+  [% draw_field_label('au', 'passwd') %]
+  [% draw_form_input('au', 'passwd'); %]
+  <div class="col-md-6 patron-reg-example">
+    <button class="btn btn-default" ng-click="generate_password()">
+      [% l('Generate Password') %]</button>
+  </div>
 </div>
 
+<!-- Stat cats -->
+
 <div ng-if="!offline">
 <div class="alert alert-success row" role="alert"
     ng-show="show_field('stat_cats') || hasRequiredStatCat" ng-if="stat_cats.length > 0">