example org settings; standalone repairs, etc.
authorBill Erickson <berickxx@gmail.com>
Thu, 21 May 2015 04:00:26 +0000 (00:00 -0400)
committerBill Erickson <berickxx@gmail.com>
Thu, 21 May 2015 04:00:26 +0000 (00:00 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/templates/staff/circ/patron/register.tt2
Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
Open-ILS/src/templates/staff/css/style.css.tt2
Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
Open-ILS/web/js/ui/default/staff/circ/patron/register.js

index b943d6d..a0b2af4 100644 (file)
@@ -5,6 +5,7 @@
 %]
 
 [% BLOCK APP_JS %]
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/register.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/regctl.js"></script>
 <link rel="stylesheet" href="[% ctx.base_path %]/staff/css/circ.css" />
index 81b05bb..4f840de 100644 (file)
 
 [% MACRO formfield(cls, field, path, input_type) BLOCK;
 
-    # input field generator for common text/number/checkbox fields
+  # input field generator for common text/number/checkbox fields
 
-    IF NOT input_type; input_type = 'text'; END %] 
+  IF NOT input_type; input_type = 'text'; END %] 
 
-<div class="row pad-all-min form-group">
+<div class="row pad-all-min2 form-group">
+
+  <div class="col-md-3 reg-field-label"> <!-- field label -->
+
+  <label>{{idl_fields.[% cls %].[% field %].label}}</label>
 
-    <div class="col-md-3 reg-field-label"> <!-- field label -->
+  <!-- field documentation img/link -->
+  <img ng-show="field_doc.[% cls %].[% field %]" 
+    ng-click="selected_field_doc=field_doc.[% cls %].[% field %]"
+    src='[% DOC_IMG %]'></img>
+  </div>
+
+  <div class="col-md-3 reg-field-input"> <!-- field form input -->
 
-        <label>{{idl_fields.[% cls %].[% field %].label}}</label>
+  [%
+    model = path ? 'patron.' _ path _ '.' _ field : 'patron.' _ field;
+      IF input_type == 'checkbox' %]
 
-        <!-- field documentation img/link -->
-        <img ng-show="field_doc.[% cls %].[% field %]" 
-            ng-click="selected_field_doc=field_doc.[% cls %].[% field %]"
-            src='[% DOC_IMG %]'></img>
+    <div class='checkbox'>
+      <input type='checkbox' ng-model='[% model %]'/>
     </div>
 
-    <div class="col-md-3 reg-field-input"> <!-- field form input -->
+  [% ELSE %]
+  <!-- text / number input -->
 
-        [%
-        model = path ? 'patron.' _ path _ '.' _ field : 'patron.' _ field;
-        IF input_type == 'checkbox' %]
+    <input type="[% input_type %]" 
+      class="form-control" ng-model="[% model %]"/>
+  [% END %]
+  </div>
 
-            <div class='checkbox'>
-                <input type='checkbox' ng-model='[% model %]'/>
-            </div>
+  <div class="col-md-3 patron-reg-example">
+    [% set_str = "org_settings['ui.patron.edit." _ 
+        cls _ "." _ field _ ".example']"; %]
 
-        [% ELSE %]
-            <!-- text / number input -->
+    <span ng-if="[% set_str %]">
+      [% l('Example: [_1]', "{{" _ set_str _ "}}") %]
+    </span>
 
-            <input type="[% input_type %]" 
-                class="form-control" ng-model="[% model %]"/>
-        [% END %]
-    </div>
+    [% IF field.match('phone') %]
+      <!-- phones have a fall-through example option -->
+      <span ng-if="![% set_str %]">
+        [% l('Example: [_1]', 
+         "{{org_settings['ui.patron.edit.phone.example']}}") %]
+      </span>
+    [% END %]
+
+  </div>
 </div>
 [% END %]
 
 [% formfield('au', 'alias') %]
 
 <div class="row pad-all-min form-group">
-    <div class="col-md-3 reg-field-label">
-        <label>{{idl_fields.au.dob.label}}</label>
-        <img ng-show="field_doc.au.dob" 
-            ng-click="selected_field_doc=field_doc.au.dob"
-            src='[% DOC_IMG %]'></img>
-    </div>
-    <div class="col-md-3 reg-field-input">
-        <input eg-date-input 
-            class="form-control" ng-model="patron.dob"/>
-    </div>
+  <div class="col-md-3 reg-field-label">
+    <label>{{idl_fields.au.dob.label}}</label>
+    <img ng-show="field_doc.au.dob" 
+      ng-click="selected_field_doc=field_doc.au.dob"
+      src='[% DOC_IMG %]'></img>
+  </div>
+  <div class="col-md-3 reg-field-input">
+    <input eg-date-input 
+      class="form-control" ng-model="patron.dob"/>
+  </div>
 </div>
 
 [% formfield('au', 'juvenile', '', 'checkbox') %]
 <!-- ident_type -->
 
 <div class="row pad-all-min form-group">
-    <div class="col-md-3 reg-field-label">
-        <label>{{idl_fields.au.ident_type.label}}</label>
-        <img ng-show="field_doc.au.ident_type" 
-            ng-click="selected_field_doc=field_doc.au.ident_type"
-            src='[% DOC_IMG %]'></img>
-    </div>
-    <div class="col-md-3 reg-field-input">
-        <div class="btn-group" dropdown>
-          <button type="button" class="btn btn-default dropdown-toggle">
-            <span style="padding-right: 5px;">
-                {{patron.ident_type.name() || "[% l('Primary Ident Type') %]"}}
-            </span>
-            <span class="caret"></span>
-          </button>
-          <ul class="dropdown-menu">
-            <li ng-repeat="type in ident_types">
-              <a href ng-click="patron.ident_type = type">{{type.name()}}</a>
-            </li>
-          </ul>
-        </div>
+  <div class="col-md-3 reg-field-label">
+    <label>{{idl_fields.au.ident_type.label}}</label>
+    <img ng-show="field_doc.au.ident_type" 
+      ng-click="selected_field_doc=field_doc.au.ident_type"
+      src='[% DOC_IMG %]'></img>
+  </div>
+  <div class="col-md-3 reg-field-input">
+    <div class="btn-group" dropdown>
+      <button type="button" class="btn btn-default dropdown-toggle">
+        <span style="padding-right: 5px;">
+          {{patron.ident_type.name() || "[% l('Primary Ident Type') %]"}}
+        </span>
+        <span class="caret"></span>
+      </button>
+      <ul class="dropdown-menu">
+        <li ng-repeat="type in ident_types">
+          <a href ng-click="patron.ident_type = type">{{type.name()}}</a>
+        </li>
+      </ul>
     </div>
+  </div>
 </div>
 
 
 [% formfield('au', 'ident_value') %]
 [% formfield('au', 'ident_value2') %]
-[% formfield('au', 'email') %]
+[% formfield('au', 'email', '', 'email') %]
 [% formfield('au', 'day_phone') %]
 [% formfield('au', 'evening_phone') %]
 [% formfield('au', 'other_phone') %]
 <!-- home org unit selector -->
 
 <div class="row pad-all-min form-group">
-    <div class="col-md-3 reg-field-label">
-        <label>{{idl_fields.au.home_ou.label}}</label>
-        <img ng-show="field_doc.au.home_ou" 
-            ng-click="selected_field_doc=field_doc.au.home_ou"
-            src='[% DOC_IMG %]'></img>
+  <div class="col-md-3 reg-field-label">
+    <label>{{idl_fields.au.home_ou.label}}</label>
+    <img ng-show="field_doc.au.home_ou" 
+      ng-click="selected_field_doc=field_doc.au.home_ou"
+      src='[% DOC_IMG %]'></img>
     </div>
     <div class="col-md-3 reg-field-input">
-        <eg-org-selector selected="patron.home_ou" 
-            onchange=""></eg-org-selector>
-    </div>
+      <eg-org-selector selected="patron.home_ou" onchange="">
+      </eg-org-selector>
+  </div>
 </div>
 
 <!-- profile selector -->
 
 <div class="row pad-all-min form-group">
-    <div class="col-md-3 reg-field-label">
-        <label>{{idl_fields.au.profile.label}}</label>
-        <img ng-show="field_doc.au.profile" 
-            ng-click="selected_field_doc=field_doc.au.profile"
-            src='[% DOC_IMG %]'></img>
-    </div>
-    <div class="col-md-3 reg-field-input">
-        <div class="btn-group" dropdown>
-          <button type="button" class="btn btn-default dropdown-toggle">
-            <span style="padding-right: 5px;">
-                {{patron.profile.name() || "[% l('Profile Group') %]"}}
-            </span>
-            <span class="caret"></span>
-          </button>
-          <ul class="dropdown-menu">
-            <li ng-repeat="grp in profiles">
-              <a href 
-                style="padding-left: {{pgt_depth(grp) * 10 + 5}}px"
-                ng-click="patron.profile = grp">{{grp.name()}}</a>
-            </li>
-          </ul>
-        </div>
+  <div class="col-md-3 reg-field-label">
+    <label>{{idl_fields.au.profile.label}}</label>
+    <img ng-show="field_doc.au.profile" 
+      ng-click="selected_field_doc=field_doc.au.profile"
+      src='[% DOC_IMG %]'></img>
+  </div>
+  <div class="col-md-3 reg-field-input">
+    <div class="btn-group" dropdown>
+      <button type="button" class="btn btn-default dropdown-toggle">
+        <span style="padding-right: 5px;">
+          {{patron.profile.name() || "[% l('Profile Group') %]"}}
+        </span>
+        <span class="caret"></span>
+      </button>
+      <ul class="dropdown-menu">
+        <li ng-repeat="grp in profiles">
+          <a href 
+            style="padding-left: {{pgt_depth(grp) * 10 + 5}}px"
+            ng-click="patron.profile = grp">{{grp.name()}}</a>
+        </li>
+      </ul>
     </div>
+  </div>
 </div>
 
 <div class="row pad-all-min form-group">
-    <div class="col-md-3 reg-field-label">
-        <label>{{idl_fields.au.expire_date.label}}</label>
-        <img ng-show="field_doc.au.expire_date" 
-            ng-click="selected_field_doc=field_doc.au.expire_date"
-            src='[% DOC_IMG %]'></img>
-    </div>
-    <div class="col-md-3 reg-field-input">
-        <input eg-date-input 
-            class="form-control" ng-model="patron.expire_date"/>
-    </div>
+  <div class="col-md-3 reg-field-label">
+  <label>{{idl_fields.au.expire_date.label}}</label>
+    <img ng-show="field_doc.au.expire_date" 
+    ng-click="selected_field_doc=field_doc.au.expire_date"
+    src='[% DOC_IMG %]'></img>
+  </div>
+  <div class="col-md-3 reg-field-input">
+    <input eg-date-input 
+      class="form-control" ng-model="patron.expire_date"/>
+  </div>
 </div>
 
 <!-- net_access_level -->
 
 <div class="row pad-all-min form-group">
-    <div class="col-md-3 reg-field-label">
-        <label>{{idl_fields.au.net_access_level.label}}</label>
-        <img ng-show="field_doc.au.net_access_level" 
-            ng-click="selected_field_doc=field_doc.au.net_access_level"
-            src='[% DOC_IMG %]'></img>
-    </div>
-    <div class="col-md-3 reg-field-input">
-        <div class="btn-group" dropdown>
-          <button type="button" class="btn btn-default dropdown-toggle">
-            <span style="padding-right: 5px;">
-                {{patron.net_access_level.name() || "[% l('Net Access Level') %]"}}
-            </span>
-            <span class="caret"></span>
-          </button>
-          <ul class="dropdown-menu">
-            <li ng-repeat="level in net_access_levels">
-              <a href 
-                ng-click="patron.net_access_level = level">{{level.name()}}</a>
-            </li>
-          </ul>
-        </div>
+  <div class="col-md-3 reg-field-label">
+    <label>{{idl_fields.au.net_access_level.label}}</label>
+    <img ng-show="field_doc.au.net_access_level" 
+      ng-click="selected_field_doc=field_doc.au.net_access_level"
+      src='[% DOC_IMG %]'></img>
+  </div>
+  <div class="col-md-3 reg-field-input">
+    <div class="btn-group" dropdown>
+      <button type="button" class="btn btn-default dropdown-toggle">
+        <span style="padding-right: 5px;">
+          {{patron.net_access_level.name() || "[% l('Net Access Level') %]"}}
+        </span>
+        <span class="caret"></span>
+      </button>
+      <ul class="dropdown-menu">
+        <li ng-repeat="level in net_access_levels">
+          <a href 
+            ng-click="patron.net_access_level = level">{{level.name()}}</a>
+        </li>
+      </ul>
     </div>
+  </div>
 </div>
 
 [% formfield('au', 'active', '', 'checkbox') %]
 [% formfield('au', 'alert_message') %]
 
 <div class="alert alert-success row" role="alert">
-    <div class="col-md-6">[% l('User Settings') %]</div>
+  <div class="col-md-6">[% l('User Settings') %]</div>
 </div>
 
 <div class="row pad-all-min form-group">
     <label>{{survey.name()}}</label>
   </div>
   <div class="col-md-3 reg-field-input">
-      <div class="btn-group" dropdown>
-        <button type="button" class="btn btn-default dropdown-toggle">
-          <span style="padding-right: 5px;"></span>
-          <span class="caret"></span>
-        </button>
-        <ul class="dropdown-menu">
-          <li ng-repeat="question in survey.questions()">
-            <a href ng-click=""> {{question.question()}} </a>
-          </li>
-        </ul>
-      </div>
+    <div class="btn-group" dropdown>
+      <button type="button" class="btn btn-default dropdown-toggle">
+        <span style="padding-right: 5px;"></span>
+        <span class="caret"></span>
+      </button>
+      <ul class="dropdown-menu">
+        <li ng-repeat="question in survey.questions()">
+          <a href ng-click=""> {{question.question()}} </a>
+        </li>
+      </ul>
+    </div>
   </div>
 </div>
 
index 300668c..8b4f3bb 100644 (file)
@@ -115,6 +115,7 @@ table.list tr.selected td { /* deprecated? */
 .pad-left {padding-left: 10px;}
 .pad-right {padding-right: 10px;}
 .pad-all-min {padding : 5px; }
+.pad-all-min2 {padding : 2px; }
 .pad-all {padding : 10px; }
 
 #print-div { display: none; }
index 108a41b..b940514 100644 (file)
@@ -9,7 +9,7 @@ angular.module('egCoreMod')
         profiles : [],              // permission groups
         sms_carriers : [],
         user_settings : {},         // applied user settings
-        user_setting_types : {}, 
+        user_setting_types : {},    // config.usr_setting_type
         modified_user_settings : {} // settings modifed this session
     };
 
@@ -131,7 +131,7 @@ angular.module('egCoreMod')
         });
     };
 
-    // some org settings require the retrieval of additional data...
+    // some org settings require the retrieval of additional data
     service.process_org_settings = function(settings) {
 
         if (!settings['sms.enable']) {
@@ -193,7 +193,7 @@ angular.module('egCoreMod')
 
         return egCore.pcrud.search('cust', {
             '-or' : [
-                {name : [
+                {name : [ // common user settings
                     'circ.holds_behind_desk', 
                     'circ.collections.exempt', 
                     'opac.hold_notify', 
@@ -201,7 +201,7 @@ angular.module('egCoreMod')
                     'opac.default_pickup_location', 
                     'opac.default_sms_carrier', 
                     'opac.default_sms_notify']}, 
-                {name : {
+                {name : { // opt-in notification user settings
                     'in': {
                         select : {atevdef : ['opt_in_setting']}, 
                         from : 'atevdef',
@@ -218,6 +218,8 @@ angular.module('egCoreMod')
             });
 
             if(service.patron_id) {
+                // retrieve applied values for the current user 
+                // for the setting types we care about.
 
                 var setting_names = 
                     setting_types.map(function(obj) { return obj.name() });
@@ -250,12 +252,11 @@ angular.module('egCoreMod')
             return service.init_new_patron();
 
         service.patron = current;
-        service.patron_id = current.id();
         return service.init_existing_patron(current)
     }
 
     /*
-     * Existing patron objects reqire massaging before insertion 
+     * Existing patron objects reqire some data munging before insertion
      * into the scope.
      *
      * 1. Turn everything into a hash
@@ -287,12 +288,21 @@ angular.module('egCoreMod')
     }
 
     service.init_new_patron = function() {
+
+        var addr = {
+            valid : true,
+            within_city_limits : true
+            // default state, etc.
+        };
+
         return {
             isnew : true,
             active : true,
             card : {},
             home_ou : egCore.org.get(egCore.auth.user().ws_ou()),
             // TODO default profile group?
+            mailing_address : addr,
+            addresses : [addr]
         };
     }
 
@@ -303,6 +313,11 @@ angular.module('egCoreMod')
 function PatronRegCtrl($scope, $routeParams, 
     $q, egCore, patronSvc, patronRegSvc) {
 
+    $scope.clone_id = $routeParams.clone_id;
+    $scope.stage_username = $routeParams.stage_username;
+    $scope.patron_id = 
+        patronRegSvc.patron_id = $routeParams.edit_id || $routeParams.id;
+
     $q.all([
 
         $scope.initTab ? // initTab comes from patron app
@@ -314,7 +329,8 @@ function PatronRegCtrl($scope, $routeParams,
         // called after initTab and patronRegSvc.init have completed
 
         var prs = patronRegSvc; // brevity
-        $scope.patron = prs.init_patron(patronSvc.current);
+        // in standalone mode, we have no patronSvc
+        $scope.patron = prs.init_patron(patronSvc ? patronSvc.current : null);
         $scope.field_doc = prs.field_doc;
         $scope.profiles = prs.profiles;
         $scope.ident_types = prs.ident_types;
@@ -342,9 +358,6 @@ function PatronRegCtrl($scope, $routeParams,
         aua : egCore.idl.classes.aua.field_map
     };
 
-    $scope.patron_id = $routeParams.edit_id || $routeParams.id;
-    $scope.clone_id = $routeParams.clone_id;
-    $scope.stage_username = $routeParams.stage_username;
 }
 
 
index b8cbe27..49306f0 100644 (file)
@@ -4,7 +4,7 @@
  * Search, checkout, items out, holds, bills, edit, etc.
  */
 
-angular.module('egPatronRegApp', ['ui.bootstrap','ngRoute','egCoreMod'])
+angular.module('egPatronRegApp', ['ui.bootstrap','ngRoute','egCoreMod', 'egUiMod'])
 
 
 .config(function($routeProvider, $locationProvider, $compileProvider) {