e22e0e09dd
This makes the necessary changes in the patron module of the staff interface, so the new patron attribute appers and behaves correctly when editing a patron record. To test: * You will need to test different configuration options for extended patron attributes (PA) in combination with the date option: * PA is a date and not mandatory * Patron form should have the calendar widget to let you set the date. * PA is a date and mandatory * Patron form shoudl have calendar widget and check that the date is set for allowing you to save the record. * PA is a date and unique * For this set the date in one patron record and try to set the same date in another. You should not be able to save. * PA displays in brief patron information * Make sure the date displays on the left formatted correctly * When the date PAs are saved, they should display nicely formatted on the details tab. Signed-off-by: Philip Orr <philip.orr@lmscloud.de> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
302 lines
18 KiB
HTML
302 lines
18 KiB
HTML
[% USE Koha %]
|
|
[% USE KohaDates %]
|
|
[% PROCESS 'member-display-address-style.inc' %]
|
|
[% IF ( patron.borrowernumber ) %]
|
|
[% SET patron_is_staff = patron.has_permission({ 'catalogue' => 1 }) %]
|
|
[% SET patron_is_superlibrarian = patron.is_superlibrarian %]
|
|
[% SET patron_type_class = 'is-not-staff' %]
|
|
[% IF ( patron_is_superlibrarian ) %]
|
|
[% patron_type_class = 'is-staff is-superlibrarian' %]
|
|
[% ELSIF ( patron_is_staff ) %]
|
|
[% patron_type_class = 'is-staff' %]
|
|
[% END %]
|
|
<div class="patroninfo [% patron_type_class | html %]">
|
|
|
|
[% IF ( patronimages ) %]
|
|
<h5 class="text-center">
|
|
[% ELSE %]
|
|
<h5>
|
|
[% END %]
|
|
[% IF ( patron_is_staff ) %]
|
|
<i class="fa-solid fa-shield fa-fw" title="Staff patron"></i>
|
|
[% END %]
|
|
[% IF ( patron_is_superlibrarian ) %]
|
|
<i class="fa fa-bolt fa-fw" title="Superlibrarian patron"></i>
|
|
[% END %]
|
|
[% IF ( patron.protected ) %]
|
|
<i class="fa fa-lock fa-fw" title="Protected patron"></i>
|
|
[% END %]
|
|
[% INCLUDE 'patron-title.inc' %]
|
|
</h5>
|
|
[% IF Koha.Preference('showLastPatron') %]
|
|
<input type="hidden" id="hiddenborrowernumber" value="[% patron.borrowernumber | html %]">
|
|
<input type="hidden" id="hiddenborrowername" value="[% patron.surname | html %] [% patron.firstname | html %]">
|
|
<input type="hidden" id="hiddenborrowercard" value="[% patron.cardnumber | html %]">
|
|
[% END %]
|
|
|
|
[% IF ( patronimages ) %]
|
|
<div>
|
|
<div class="patronimage-container">
|
|
[% IF ( patron.image ) %]
|
|
<img src="/cgi-bin/koha/members/patronimage.pl?borrowernumber=[% patron.borrowernumber | uri %]" class="patronimage" alt="[% patron.firstname | html %] [% patron.surname | html %] ([% patron.cardnumber | html %])" />
|
|
[% IF ( CAN_user_tools_batch_upload_patron_images ) %]
|
|
<div class="patronimage-controls">
|
|
<div class="patronimage-control"><a data-borrowernumber="[% patron.borrowernumber | uri %]" data-cardnumber="[% patron.cardnumber | html %]" class="btn btn-default edit-patronimage" title="Patron photo" href="#"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a></div>
|
|
</div>
|
|
[% END %]
|
|
[% ELSE %]
|
|
<div class="patronimage empty"></div>
|
|
[% IF ( CAN_user_tools_batch_upload_patron_images ) %]
|
|
<div class="patronimage-controls">
|
|
<div class="patronimage-control"><a data-borrowernumber="[% patron.borrowernumber | uri %]" data-cardnumber="[% patron.cardnumber | html %]" class="btn btn-default edit-patronimage" title="Patron photo" href="#"><i class="fa fa-plus"></i> Add</a></div>
|
|
</div>
|
|
[% END %]
|
|
[% END %]
|
|
</div>
|
|
</div>
|
|
[% END %]
|
|
|
|
<ul class="patronbriefinfo">
|
|
|
|
[% IF patron.pronouns %]
|
|
<li class="patronpronouns">([% patron.pronouns | html %])</li>
|
|
[% END %]
|
|
|
|
[% IF !(Koha.Preference('HidePersonalPatronDetailOnCirculation')) %]
|
|
|
|
[% PROCESS 'display-address-style' %]
|
|
|
|
[% IF ( patron.phone || patron.mobile || patron.phonepro ) %]<li class="patronphone">
|
|
[% IF ( patron.phone ) %]
|
|
<a href="tel:[% patron.phone | url %]">[% patron.phone | html %]</a>
|
|
[% ELSE %]
|
|
[% IF ( patron.mobile ) %]
|
|
<a href="tel:[% patron.mobile | url %]">[% patron.mobile | html %]</a>
|
|
[% ELSE %]
|
|
[% IF ( patron.phonepro ) %]
|
|
<a href="tel:[% patron.phonepro | url %]">[% patron.phonepro | html %]</a>
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]</li>[% END %]
|
|
[% IF ( patron.email ) %]
|
|
<li class="email"> <a href="mailto:[% patron.email | url %]" title="[% patron.email | html %]">[% patron.email | html %]</a></li>
|
|
[% ELSE %]
|
|
[% IF ( patron.emailpro ) %]
|
|
<li class="email"> <a href="mailto:[% patron.emailpro | url %]" title="[% patron.emailpro | html %]">[% patron.emailpro | html %]</a></li>
|
|
[% END %]
|
|
[% END %]
|
|
[% IF ( patron.dateofbirth ) %]
|
|
<li class="patrondateofbirth">
|
|
<span>Born:</span>
|
|
[% INCLUDE 'patron-age.inc' %]
|
|
</li>
|
|
[% END %]
|
|
|
|
[% UNLESS ( patron.address or patron.address2 ) %]
|
|
<li><span class="empty" id="noaddressstored">No address stored.</span></li>
|
|
[% END %]
|
|
[% UNLESS ( patron.city ) %]
|
|
<li><span class="empty" id="nocitystored">No city stored.</span></li>
|
|
[% END %]
|
|
[% UNLESS ( patron.phone or patron.mobile or patron.phonepro) %]
|
|
<li> <span class="empty">No phone stored.</span></li>
|
|
[% END %]
|
|
[% UNLESS ( patron.email or patron.emailpro) %]
|
|
<li> <span class="empty">No email stored.</span></li>
|
|
[% END %]
|
|
[% UNLESS ( patron.dateofbirth ) %]
|
|
<li> <span class="empty">No date of birth stored.</span></li>
|
|
[% END %]
|
|
|
|
[% END %]
|
|
|
|
[% IF Koha.Preference('ExtendedPatronAttributes') %]
|
|
[% FOREACH extendedattribute IN patron.extended_attributes %]
|
|
[% IF ( extendedattribute.type.display_checkout ) %] [%# FIXME We should filter in the line above %]
|
|
[% IF ( extendedattribute.attribute.defined ) %]
|
|
<li class="patronattribute">
|
|
<span class="patronattributelabel">[% extendedattribute.type.description | html %]</span>:
|
|
[% IF extendedattribute.type.is_date %]
|
|
[% extendedattribute.description | $KohaDates %]
|
|
[% ELSE %]
|
|
[% extendedattribute.description | html %]
|
|
[% END %]
|
|
</li>
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
<li class="patroncategory">Category: <span class="patroncategory_description">[% patron.category.description | html %]</span> <span class="patroncategory_code">([% patron.categorycode | html %])</span></li>
|
|
<li class="patronlibrary">Home library: [% Branches.GetName( patron.branchcode ) | html %]</li>
|
|
<li class="patronborrowernumber">Borrowernumber: [% patron.borrowernumber | html %]</li>
|
|
<li><span class="patronupdatedon">Updated on [% patron.updated_on | $KohaDates with_hours => 1 %]</span></li>
|
|
[% IF patron.account_locked %]
|
|
[% IF patron.login_attempts < 0 %]
|
|
<li class="blocker account_admin_locked">Account has been administratively locked</li>
|
|
[% ELSE %]
|
|
<li class="blocker account_locked">Account has been locked</li>
|
|
[% END %]
|
|
[% END %]
|
|
</ul></div>
|
|
<div id="menu">
|
|
<ul>
|
|
[% IF ( CAN_user_circulate_circulate_remaining_permissions ) %]
|
|
[% IF ( circview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/circ/circulation.pl?borrowernumber=[% patron.borrowernumber | uri %]">Check out</a></li>
|
|
[% IF Koha.Preference('BatchCheckouts') && Koha.Preference('BatchCheckoutsValidCategories').split(',').grep('^' _ patron.categorycode _ '$').size > 0 %]
|
|
[% IF ( batch_checkout_view ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/circ/circulation.pl?borrowernumber=[% patron.borrowernumber | uri %]&batch=1">Batch check out</a></li>
|
|
[% END %]
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers %]
|
|
[% IF ( detailview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">Details</a></li>
|
|
[% END %]
|
|
[% IF ( CAN_user_updatecharges_remaining_permissions ) %]
|
|
[% IF ( finesview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]">Accounting</a></li>
|
|
[% END %]
|
|
[% IF ( CAN_user_circulate_circulate_remaining_permissions ) %]
|
|
[% IF Koha.Preference("RoutingSerials") %][% IF ( routinglistview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/routing-lists.pl?borrowernumber=[% patron.borrowernumber | uri %]">Routing lists</a></li>[% END %]
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers %]
|
|
[% IF ( intranetreadinghistory ) %]
|
|
[% IF ( readingrecordview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/readingrec.pl?borrowernumber=[% patron.borrowernumber | uri %]">Circulation history</a></li>
|
|
[% END %]
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers %]
|
|
[% IF ( IntranetReadingHistoryHolds ) %]
|
|
[% IF ( holdshistoryview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/holdshistory.pl?borrowernumber=[% patron.borrowernumber | uri %]">Holds history</a></li>
|
|
[% END %]
|
|
[% END %]
|
|
[% IF ( CAN_user_tools_view_system_logs ) %]
|
|
[% IF ( logview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/tools/viewlog.pl?do_it=1&modules=MEMBERS&modules=CIRCULATION&object=[% patron.borrowernumber | uri %]&src=circ">Modification log</a></li>
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers %]
|
|
[% IF ( sentnotices ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/notices.pl?borrowernumber=[% patron.borrowernumber | uri %]">Notices</a></li>
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers %]
|
|
[% IF ( statisticsview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/statistics.pl?borrowernumber=[% patron.borrowernumber | uri %]">Statistics</a></li>
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers %]
|
|
[% IF ( EnableBorrowerFiles ) %]
|
|
[% IF ( borrower_files ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/files.pl?borrowernumber=[% patron.borrowernumber | uri %]">Files</a></li>
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% IF CAN_user_suggestions_suggestions_manage %]
|
|
[% IF ( suggestionsview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/purchase-suggestions.pl?borrowernumber=[% patron.borrowernumber | uri %]">Purchase suggestions</a></li>
|
|
[% END %]
|
|
[% IF CAN_user_borrowers_edit_borrowers && useDischarge %]
|
|
[% IF dischargeview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/discharge.pl?borrowernumber=[% patron.borrowernumber | uri %]">Discharges</a></li>
|
|
[% END %]
|
|
[% IF Koha.Preference('HouseboundModule') %]
|
|
[% IF houseboundview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/housebound.pl?borrowernumber=[% patron.borrowernumber | uri %]">Housebound</a></li>
|
|
[% END %]
|
|
[% IF Koha.Preference('ILLModule') && CAN_user_ill %]
|
|
[% IF illview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/ill-requests.pl?borrowernumber=[% patron.borrowernumber | uri %]">ILL requests history</a></li>
|
|
[% END %]
|
|
[% IF Koha.Preference('UseRecalls') && CAN_user_recalls %]
|
|
[% IF recallsview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/recallshistory.pl?borrowernumber=[% patron.borrowernumber | uri %]">Recalls history</a></li>
|
|
[% END %]
|
|
[% IF ( CAN_user_serials && patron.alert_subscriptions.count ) %]
|
|
[% IF alertsview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/alert-subscriptions.pl?borrowernumber=[% patron.borrowernumber | uri %]">Alert subscriptions ([% patron.alert_subscriptions.count | html %])</a></li>
|
|
[% END %]
|
|
</ul></div>
|
|
|
|
[% IF patronimages && CAN_user_tools_batch_upload_patron_images %]
|
|
<!-- Modal -->
|
|
<div class="modal" id="patronImageEdit" tabindex="-1" role="dialog" aria-labelledby="patronImageEditLabel">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="closebtn" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
|
<h4 class="modal-title" id="patronImageEditLabel">Patron photo</h4>
|
|
</div>
|
|
<div class="modal-body">
|
|
[% IF ( patron.cardnumber ) %]
|
|
<div id="upload-patron-image" class="patroninfo-section">
|
|
<h5>Upload patron photo</h5>
|
|
<form method="post" id="picture-upload" action="/cgi-bin/koha/tools/picture-upload.pl"
|
|
enctype="multipart/form-data">
|
|
[% IF ( patron.image ) %]
|
|
<div class="hint">
|
|
To update the image for [% patron.title | html %] [% patron.firstname | html %] [% patron.surname | html %], select a new image file and click 'Upload.' <br />Click the 'Delete' button to
|
|
remove the current image.
|
|
</div>
|
|
[% ELSE %]
|
|
<div class="hint">
|
|
[% patron.title | html %] [% patron.firstname | html %] [% patron.surname | html %] does not currently have an image available. To import an image for [% patron.title | html %] [% patron.firstname | html %] [% patron.surname | html %], enter the name of an image file to upload.
|
|
</div>
|
|
[% END %]
|
|
<p>Only PNG, GIF, JPEG, XPM formats are supported.</p>
|
|
<label for="uploadfile">Select the file to upload: </label>
|
|
<input type="file" id="uploadfile" name="uploadfile" required="required" />
|
|
<div class="action">
|
|
[% INCLUDE 'csrf-token.inc' %]
|
|
<input type="hidden" id="image" name="filetype" value="image" />
|
|
<input type="hidden" id="cardnumber" name="cardnumber" value="[% patron.cardnumber | html %]" />
|
|
<input type="hidden" id="borrowernumber" name="borrowernumber" value="[% patron.borrowernumber | html %]" />
|
|
<button type="submit" class="btn btn-default btn-xs" name="op" value="cud-Upload"><i class="fa fa-upload"></i> Upload photo</button>
|
|
[% IF ( patron.image ) %]
|
|
<button id="delpicture" type="submit" class="btn btn-default btn-xs delete" name="op" value="cud-Delete"><i class="fa fa-trash-can"></i> Delete</button>
|
|
[% END %]
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div id="capture-patron-image" class="patroninfo-section">
|
|
<h5>Take patron photo</h5>
|
|
<form method="post" id="camera-upload" action="/cgi-bin/koha/tools/picture-upload.pl">
|
|
<div class="btn-toolbar">
|
|
<div class="btn-group">
|
|
<button class="btn btn-default" id="takebutton"><i class="fa fa-camera"></i> Take photo</button>
|
|
</div>
|
|
<div class="btn-group">
|
|
<button class="btn btn-default" id="retakebutton" style="display:none;"><i class="fa-solid fa-rotate"></i> Retake photo</button>
|
|
</div>
|
|
<div class="btn-group">
|
|
<a id="downloadbutton" href="#" class="btn btn-default" style="display:none;"><i class="fa fa-download"></i> Download photo</a>
|
|
</div>
|
|
<div class="btn-group">
|
|
<button id="savebutton" type="submit" class="btn btn-default" style="display:none;"><i class="fa-solid fa-hard-drive"></i> Upload</button>
|
|
</div>
|
|
</div>
|
|
<div id="camera">
|
|
<video id="viewfinder">Video stream not available.</video>
|
|
</div>
|
|
<canvas id="canvas" style="display:none"></canvas>
|
|
<div id="output" style="display:none">
|
|
<img style="width:100%;height:auto;" id="photo" alt="The screen capture will appear in this box.">
|
|
</div>
|
|
<input type="hidden" name="uploadfilename" value="patron-photo.jpg" />
|
|
<textarea id="uploadfiletext" name="uploadfiletext" style="display:none;"></textarea>
|
|
[% INCLUDE 'csrf-token.inc' %]
|
|
<input type="hidden" name="filetype" value="image" />
|
|
<input type="hidden" name="cardnumber" value="[% patron.cardnumber | html %]" />
|
|
<input type="hidden" name="borrowernumber" value="[% patron.borrowernumber | html %]" />
|
|
<input name="op" type="hidden" value="cud-Upload" />
|
|
</form>
|
|
</div>
|
|
<div class="dialog message" style="display:none" id="camera-error">
|
|
<div>
|
|
<span class="fa-stack fa-lg">
|
|
<i class="fa fa-camera fa-stack-1x"></i>
|
|
<i class="fa fa-ban fa-stack-2x text-danger"></i>
|
|
</span>
|
|
</div>
|
|
<div>
|
|
<strong>Cannot take patron photo.</strong>
|
|
<span id="camera-error-message"></span>
|
|
</div>
|
|
</div>
|
|
[% ELSE %]
|
|
<div id="missing-cardnumber-picture-upload">
|
|
<p>The patron must have a card number before a patron photo can be uploaded.</p>
|
|
</div>
|
|
[% END %]
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
[% END %]
|
|
|
|
[% END %]
|