LP1797025 Allow patrons to add/edit their preferred name
authorScott <scottangel@mobiusconsortium.org>
Thu, 22 Dec 2022 17:24:08 +0000 (11:24 -0600)
committerScott <scottangel@mobiusconsortium.org>
Thu, 22 Dec 2022 17:24:08 +0000 (11:24 -0600)
Added a feature to allow patrons to update/edit their preferred name.
The form is located in the Account Preferences tab in the OPAC.

2 new files were added for the bootstrap & non-bootstrap versions. These 2 files contain the html form.
update_preferred_name.tt2

Signed-off-by: Scott <scottangel@mobiusconsortium.org>
Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2
Open-ILS/src/templates-bootstrap/opac/myopac/prefs.tt2
Open-ILS/src/templates-bootstrap/opac/myopac/update_preferred_name.tt2 [new file with mode: 0644]
Open-ILS/src/templates/opac/css/style.css.tt2
Open-ILS/src/templates/opac/myopac/prefs.tt2
Open-ILS/src/templates/opac/myopac/update_preferred_name.tt2 [new file with mode: 0644]

index 56df630..40a281b 100644 (file)
@@ -1695,6 +1695,20 @@ __PACKAGE__->register_method(
     }
 );
 
+__PACKAGE__->register_method(
+    method    => "update_passwd",
+    api_name  => "open-ils.actor.user.preferred_name.update",
+    signature => {
+        desc   => "Update the operator's preferred name",
+        params => [
+            { desc => 'Authentication token', type => 'string' },
+            { desc => 'User',                 type => 'hash' },
+            { desc => 'Current password',     type => 'string' }
+        ],
+        return => {desc => '1 on success, Event on error or incorrect current password'}
+    }
+);
+
 sub update_passwd {
     my( $self, $conn, $auth, $new_val, $orig_pw ) = @_;
     my $e = new_editor(xact=>1, authtoken=>$auth);
@@ -1741,6 +1755,17 @@ sub update_passwd {
         } elsif( $api =~ /locale/o ) {
             $db_user->locale($new_val);
             $at_event++;
+        } elsif( $api =~ /preferred_name/o ) {
+            if(ref($new_val) eq 'HASH'){
+                foreach(qw/ pref_prefix pref_first_given_name pref_second_given_name pref_family_name pref_suffix/){
+                    $db_user->$_($new_val->{$_});
+                    # Set the value to NULL when no data is submitted.
+                    eval '$db_user->clear_' . $_ . '();' if($new_val->{$_} eq '' );
+                }
+                $at_event++;
+            }else {
+                return new OpenILS::Event('BAD_PARAMS');
+            }
         }
     }
 
index 78bba4a..d406fb5 100644 (file)
@@ -2854,6 +2854,45 @@ sub load_myopac_update_password {
     return $self->generic_redirect($url);
 }
 
+sub load_myopac_update_preferred_name {
+    my $self = shift;
+    my $e = $self->editor;
+    my $ctx = $self->ctx;
+
+    $self->prepare_extended_user_info;
+
+    return Apache2::Const::OK
+        unless $self->cgi->request_method eq 'POST';
+
+    my $current_pw = $self->cgi->param('current_pw') || '';
+
+    my %opac_vals = ();
+
+    foreach(qw/ pref_prefix pref_first_given_name pref_second_given_name pref_family_name pref_suffix/ ){
+        $opac_vals{$_} = $self->cgi->param($_) if($self->cgi->param($_) && $self->cgi->param($_) ne '');
+    }
+
+    my $evt = $U->simplereq('open-ils.actor', 'open-ils.actor.user.preferred_name.update',
+        $e->authtoken, \%opac_vals, $current_pw);
+
+    if($U->event_equals($evt, 'INCORRECT_PASSWORD')) {
+        $ctx->{password_incorrect} = 1;
+        return Apache2::Const::OK;
+    }
+
+    if($U->event_equals($evt, 'BAD_PARAM')) {
+        $ctx->{bad_param} = 1;
+        return Apache2::Const::OK;
+    }
+
+    foreach(qw/ pref_prefix pref_first_given_name pref_second_given_name pref_family_name pref_suffix/ ){
+        $self->ctx->{user}->$_($opac_vals{$_});
+    }
+
+    return $self->generic_redirect($self->apache->unparsed_uri);
+
+}
+
 sub _update_bookbag_metadata {
     my ($self, $bookbag) = @_;
 
index fbbd9dd..c59d3ae 100755 (executable)
@@ -2215,7 +2215,16 @@ div#facet_sidebar {
 .subtle-button:hover { text-decoration: underline; cursor: pointer; }
 .no-dec:hover { text-decoration: none; }
 .pending-addr td { background-color: [% css_colors.background_alert %] !important; border: 0 !important; }
-
+#account-update-preferred-name table { text-align: center; padding: 20px; margin-top: 18px; border-collapse: collapse; }
+#account-update-preferred-name table td {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+    padding: 5px 15px 5px 15px;
+    border-bottom: 1px solid [% css_colors.accent_lighter %];
+}
 #account-update-email table { text-align: center; padding: 20px; margin-top: 18px; border-collapse: collapse; }
 #account-update-email table td {
     [% IF rtl == 't' -%]
index e21a757..43ae634 100755 (executable)
@@ -9,6 +9,23 @@
 <div id="acct_info_main">
     <table title="[% l('Account preference') %]" class='light_border table table-hover'>
         <tbody id='myopac_summary_tbody'>
+            <tr>
+                <td width='30%'
+                    class='color_4 light_border'>[% l("Preferred Name") %]</td>
+
+                <td class='light_border'>[% l(
+                        HUMAN_NAME_FORMAT,
+                        ctx.user.pref_prefix,
+                        (ctx.user.pref_first_given_name || ctx.user.first_given_name),
+                        ctx.user.pref_second_given_name,
+                        (ctx.user.pref_family_name || ctx.user.family_name),
+                        ctx.user.pref_suffix
+                        ) | html %]</td>
+
+                <td class='light_border'><a class="btn btn-sm btn-action" href='update_preferred_name'
+                    title="[% l('Change Preferred Name') %]"><i class="fas fa-user-cog"></i>[% l("Change") %]</a></td>
+
+            </tr>
             [% IF ctx.user.pref_first_given_name || ctx.user.pref_second_given_name || ctx.user.pref_family_name %]
             <tr>
                 <td class='color_4 light_border'>[% l("Preferred Name") %]</td>
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/update_preferred_name.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/update_preferred_name.tt2
new file mode 100644 (file)
index 0000000..8c464f4
--- /dev/null
@@ -0,0 +1,36 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "prefs"  %]
+<h3 class="sr-only">[% l('Update Username') %]</h3>
+<div id='myopac_summary_div' style="padding:0px;">
+
+    <div class="header_middle">
+        <span class="float-left">[% l('Update Username') %]</span>
+    </div>
+
+[% IF ctx.password_incorrect %]
+    <div class='account-password-error'>
+        [% |l %]Your current password was not correct.[% END %]
+    </div>
+
+[% END %]
+
+<form method='post' id='account-update-preferred-name' autocomplete='off'>
+    <table>
+        <tr><td>[% l('Current Prefix') %]</td><td> [% ctx.user.pref_prefix | html %]</td></tr>
+        <tr><td>[% l('Current First Name') %]</td><td> [% ctx.user.pref_first_given_name | html %]</td></tr>
+        <tr><td>[% l('Current Second Name') %]</td><td> [% ctx.user.pref_second_given_name | html %]</td></tr>
+        <tr><td>[% l('Current Family Name') %]</td><td> [% ctx.user.pref_family_name | html %]</td></tr>
+        <tr><td>[% l('Current Suffix') %]</td><td> [% ctx.user.pref_suffix | html %]</td></tr>
+        <tr><td><label for="current_pw">[% l('Current Password') %]</label></td><td><input type='password' name='current_pw' id='current_pw' class="form-control" /></td></tr>
+        <tr><td><label for='pref-prefix'>[% l('New Preferred Prefix') %]</label></td><td><input type='text' name='pref_prefix' id='pref_prefix' class="form-control" /></td></tr>
+        <tr><td><label for='pref-first-given-name'>[% l('New Preferred First Name') %]</label></td><td><input type='text' name='pref_first_given_name' id='pref_first_given_name' class="form-control" /></td></tr>
+        <tr><td><label for='pref-second-given-name'>[% l('New Preferred Second Name') %]</label></td><td><input type='text' name='pref_second_given_name' id='pref_second_given_name' class="form-control" /></td></tr>
+        <tr><td><label for='pref-family-name'>[% l('New Preferred Family Name') %]</label></td><td><input type='text' name='pref_family_name' id='pref_family_name' class="form-control" /></td></tr>
+        <tr><td><label for='pref-suffix'>[% l('New Preferred Suffix') %]</label></td><td><input type='text' name='pref_suffix' id='pref_suffix' class="form-control" /></td></tr>
+        <tr><td colspan='2'><button class="btn btn-confirm m-2" type='submit'><i class="fas fa-save"></i> [% l('Save Changes') %]</button></td></tr>
+    </table>
+</form>
+
+[% END %]
index c17da05..d24fc94 100644 (file)
@@ -1818,7 +1818,15 @@ div#facet_sidebar {
 .subtle-button:hover { text-decoration: underline; cursor: pointer; }
 .no-dec:hover { text-decoration: none; }
 .pending-addr td { background-color: [% css_colors.background_alert %] !important; border: 0 !important; }
-
+#account-update-preferred-name table { text-align: center; padding: 20px; margin-top: 18px; border-collapse: collapse; }
+#account-update-preferred-name table td {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+    padding: 5px 15px 5px 15px; border-bottom: 1px solid [% css_colors.accent_lighter %];
+}
 #account-update-email table { text-align: center; padding: 20px; margin-top: 18px; border-collapse: collapse; }
 #account-update-email table td {
     [% IF rtl == 't' -%]
index 683d36c..a32c7a0 100644 (file)
     <table width='70%' title="[% l('Account preference') %]"
         class='light_border data_grid'>
         <tbody id='myopac_summary_tbody'>
+            <tr>
+                <td width='30%'
+                    class='color_4 light_border'>[% l("Preferred Name") %]</td>
+
+                <td class='light_border'>[% l(
+                        HUMAN_NAME_FORMAT,
+                        ctx.user.pref_prefix,
+                        (ctx.user.pref_first_given_name || ctx.user.first_given_name),
+                        ctx.user.pref_second_given_name,
+                        (ctx.user.pref_family_name || ctx.user.family_name),
+                        ctx.user.pref_suffix
+                        ) | html %]</td>
+
+                <td></td>
+                <td><a href='update_preferred_name'
+                       title="[% l('Change Preferred Name') %]">[% l("Change") %]</a></td>
+            </tr>
             [% IF ctx.user.pref_first_given_name || ctx.user.pref_second_given_name || ctx.user.pref_family_name %]
             <tr>
                 <td width='30%'
diff --git a/Open-ILS/src/templates/opac/myopac/update_preferred_name.tt2 b/Open-ILS/src/templates/opac/myopac/update_preferred_name.tt2
new file mode 100644 (file)
index 0000000..b519c01
--- /dev/null
@@ -0,0 +1,39 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "prefs";
+    prefs_page = 'prefs';
+%]
+
+<h3 class="sr-only">[% l('Update Preferred Name') %]</h3>
+
+<div class="header_middle">
+    <span class="float-left">[% l('Update Preferred Name') %]</span>
+</div>
+
+[% IF ctx.password_incorrect %]
+    <div id='account-update-email-error'>
+        [% |l %]Your current password was not correct.[% END %]
+    </div>
+[% END %]
+
+<form method='post' id='account-update-preferred-name' autocomplete='off'>
+   <table>
+       <tr><td>[% l('Current Prefix') %]</td><td> [% ctx.user.pref_prefix | html %]</td></tr>
+       <tr><td>[% l('Current First Name') %]</td><td> [% ctx.user.pref_first_given_name | html %]</td></tr>
+       <tr><td>[% l('Current Second Name') %]</td><td> [% ctx.user.pref_second_given_name | html %]</td></tr>
+       <tr><td>[% l('Current Family Name') %]</td><td> [% ctx.user.pref_family_name | html %]</td></tr>
+       <tr><td>[% l('Current Suffix') %]</td><td> [% ctx.user.pref_suffix | html %]</td></tr>
+       <tr><td><label for="current_pw">[% l('Current Password') %]</label></td><td><input type='password' name='current_pw' id='current_pw' /></td></tr>
+       <tr><td><label for='pref-prefix'>[% l('New Preferred Prefix') %]</label></td><td><input type='text' name='pref_prefix' id='pref_prefix' /></td></tr>
+       <tr><td><label for='pref-first-given-name'>[% l('New Preferred First Name') %]</label></td><td><input type='text' name='pref_first_given_name' id='pref_first_given_name' /></td></tr>
+       <tr><td><label for='pref-second-given-name'>[% l('New Preferred Second Name') %]</label></td><td><input type='text' name='pref_second_given_name' id='pref_second_given_name' /></td></tr>
+       <tr><td><label for='pref-family-name'>[% l('New Preferred Family Name') %]</label></td><td><input type='text' name='pref_family_name' id='pref_family_name' /></td></tr>
+       <tr><td><label for='pref-suffix'>[% l('New Preferred Suffix') %]</label></td><td><input type='text' name='pref_suffix' id='pref_suffix' /></td></tr>
+       <tr><td colspan='2' align='center'><input type='submit' value='submit' /></td><td></td></tr>
+   </table>
+</form>
+
+[% END %]
+
+