Koha/koha-tmpl/intranet-tmpl/prog/en/modules/circ/pendingreserves.tt
Jonathan Druart 48bf9b1d91
Bug 30718: Use flatpickr's altInput
The idea rely on the KohaDates TT plugin for the date formatting. We
should not have any output_pref calls in pl or pm (there are some
exceptions, for ILSDI for instance).

Also flatpickr will deal with the places where dates are inputed. We
will pass the raw SQL value (what we call 'iso' in Koha::DateUtils), and
the controller will receive the same value, no need to additional
conversion.
Note that DBIC has the capability to auto-deflate DateTime objects,
which makes things way easier. We can either pass the value we receive
from the controller, or pass a DT object to our methods.

Signed-off-by: Victor Grousset/tuxayo <victor@tuxayo.net>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2022-08-19 08:26:31 -03:00

365 lines
15 KiB
Text

[% USE raw %]
[% USE Asset %]
[% USE Koha %]
[% USE KohaDates %]
[% USE TablesSettings %]
[% USE AuthorisedValues %]
[%- USE Branches -%]
[%- USE ItemTypes -%]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Holds to pull &rsaquo; Circulation &rsaquo; Koha</title>
[% INCLUDE 'doc-head-close.inc' %]
</head>
<body id="circ_pendingreserves" class="circ">
[% INCLUDE 'header.inc' %]
[% INCLUDE 'circ-search.inc' %]
<nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb">
<ol>
<li>
<a href="/cgi-bin/koha/mainpage.pl">Home</a>
</li>
<li>
<a href="/cgi-bin/koha/circ/circulation-home.pl">Circulation</a>
</li>
<li>
<a href="#" aria-current="page">
Holds to pull
</a>
</li>
</ol>
</nav>
<div class="main container-fluid">
<div class="row">
<div class="col-sm-10 col-sm-push-2">
<main>
[% FOR m IN messages %]
<div class="dialog [% m.type | html %]">
[% SWITCH m.code %]
[% CASE 'letter_enqueued' %]
<span>The notice has been correctly enqueued.</span>
[% CASE 'no_email_address' %]
<span>The patron does not have an email address defined.</span>
[% CASE 'no_template_notice' %]
<span>There is no notice template with a code 'CANCEL_HOLD_ON_LOST' defined in your system.</span>
[% CASE 'hold_cancelled' %]
<span>The hold has been correctly cancelled.</span>
[% CASE 'hold_placed_at_biblio_level' %]
<span>The hold has been placed on biblio level. It is not possible to determine the item to mark as lost.</span>
[% CASE %]
[% m.code | html %]
[% END %]
</div>
[% END %]
<h1>Holds to pull placed between [% from | $KohaDates %] and [% to | $KohaDates %]</h1>
<h3>Reported on [% todaysdate | $KohaDates %]</h3>
<p>The following holds have not been filled. Please retrieve them and check them in.</p>
<div id="searchresults">
[% IF holds_info %]
<table id="holdst">
<thead>
<tr>
<th>Pull this many items</th>
<th>Items available</th>
<th>Patrons with holds</th>
<th>First patron</th>
<th class="anti-the">Title</th>
<th class="string-sort">Libraries</th>
<th>Available barcodes</th>
<th>Available call numbers</th>
<th>Available copy numbers</th>
<th>Available enumeration</th>
<th class="string-sort">Available item types</th>
<th class="string-sort">Available locations</th>
<th>Earliest hold date</th>
<th>Hold notes</th>
<th class="string-sort">Pickup location</th>
<th>Action</th>
</tr>
</thead>
<tbody>
[% FOREACH hold_info IN holds_info %]
<tr>
[% SET patron = hold_info.patron %]
[% SET item = hold_info.item %]
[% SET hold = hold_info.hold %]
[% IF patron %]
[% SET biblio = hold_info.biblio %]
<td><p><strong>[% hold_info.pull_count | html %]</strong></p></td>
<td>[% hold_info.items_count | html %]</td>
<td>[% hold_info.patrons_count | html %]</td>
<td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">[% patron.firstname | html %] [% patron.surname | html %]</a></td>
<td>
<p>
[% INCLUDE 'biblio-title.inc' biblio=biblio link = 1 %]
</p>
[% IF ( biblio.author ) %]<p> by [% biblio.author | html %]</p>[% END %]
[% IF ( biblio.biblioitem.editionstatement ) %]<p>[% biblio.biblioitem.editionstatement | html %]</p>[% END %]
[% IF ( Koha.Preference('marcflavour') == 'MARC21' ) %]
[% IF ( biblio.copyrightdate ) %]<p>[% biblio.copyrightdate | html %]</p>[% END %]
[% ELSE %]
[% IF ( biblio.biblioitem.publicationyear ) %]<p>[% biblio.biblioitem.publicationyear | html %]</p>[% END %]
[% END %]
</td>
[% ELSE %]
<td>"</td>
<td>"</td>
<td>"</td>
<td>"</td>
<td>"</td>
[% END %]
<td>
[% IF ( hold_info.holdingbranches.size ) %]
<ul>
[% FOREACH holdingbranch IN hold_info.holdingbranches %]
<li>[% Branches.GetName ( holdingbranch ) | html %]</li>
[% END %]
</ul>
[% END %]
</td>
<td>
[% IF ( hold_info.barcodes.size ) %]
[% SET barcode = hold_info.barcodes.first %]
[% IF ( hold_info.item ) %]<span>Only [% barcode | html %]</span>[% ELSE %]<span>[% barcode | html %] or any available.</span>[% END %]
[% END %]
</td>
<td>
[% IF ( hold_info.callnumbers.size ) %]
<ul>
[% FOREACH callnumber IN hold_info.callnumbers %]
<li>
[% callnumber | html %]
</li>
[% END %]
</ul>
[% END %]
</td>
<td>
[% IF ( hold_info.copynumbers.size ) %]
<ul>
[% FOREACH copyno IN hold_info.copynumbers %]
<li>
[% copyno | html %]
</li>
[% END %]
</ul>
[% END %]
</td>
<td>
[% IF ( hold_info.enumchrons.size ) %]
<ul>
[% FOREACH enumchron IN hold_info.enumchrons %]
<li>
[% enumchron | html %]
</li>
[% END %]
</ul>
[% END %]
</td>
<td>
<ul>
[% FOREACH type IN hold_info.itemtypes %]
<li>[% ItemTypes.GetDescription( type ) | html %]</li>
[% END %]
</ul>
</td>
<td>
<ul>
[% FOREACH loc IN hold_info.locations %]
<li>[% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.location', authorised_value => loc ) | html %]</li>
[% END %]
</ul>
</td>
<td data-order="[% hold.reservedate | html %]">
[% hold.reservedate | $KohaDates %] in [% Branches.GetName ( hold.branchcode ) | html %]
</td>
<td>[% hold.reservenotes | html %]</td>
<td>
[% Branches.GetName ( hold.branchcode ) | html %]
</td>
<td>
<form name="cancelReserve" action="/cgi-bin/koha/circ/pendingreserves.pl" method="post">
<input type="hidden" name="op" value="cancel_reserve" />
<input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" />
[% SET hold_cancellation = AuthorisedValues.GetAuthValueDropbox('HOLD_CANCELLATION') %]
[% IF hold_cancellation.count %]
<div class="form-group">
<label for="cancellation-reason">Cancellation reason:</label>
<select class="cancellation-reason" name="cancellation-reason" id="cancellation-reason">
<option value="">No reason given</option>
[% FOREACH reason IN hold_cancellation %]
<option value="[% reason.authorised_value | html %]">[% reason.lib | html %]</option>
[% END %]
</select>
</div>
[% END %]
[% IF item.holdingbranch != item.homebranch %]
<input class="btn btn-default" type="submit" value="Cancel hold and return to : [% Branches.GetName( item.homebranch ) | html %]" />
[% ELSE %]
<input class="btn btn-default" type="submit" value="Cancel hold" />
[% END %]
</form>
[% IF Koha.Preference('CanMarkHoldsToPullAsLost') != 'do_not_allow' %]
[% IF hold.itemnumber %]
<form name="cancelReserve" action="/cgi-bin/koha/circ/pendingreserves.pl" method="post">
<input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" />
[% IF Koha.Preference('CanMarkHoldsToPullAsLost') == 'allow' %]
<input type="hidden" name="op" value="mark_as_lost" />
<input type="submit" value="Mark item as lost" />
[% ELSIF Koha.Preference('CanMarkHoldsToPullAsLost') == 'allow_and_notify' %]
<input type="hidden" name="op" value="mark_as_lost_and_notify" />
<input type="submit" value="Mark lost and notify patron" />
[% END %]
</form>
[% ELSE %]
<span>Biblio level hold.</span>
[% END %]
[% END %]
</td>
</tr>
[% END %]
</tbody>
<tfoot>
<tr>
<td><input type="text" class="filter" data-column_num="0" placeholder="Pull this many items" style="width:95%"/></td>
<td><input type="text" class="filter" data-column_num="1" placeholder="Items available" style="width:95%"/></td>
<td><input type="text" class="filter" data-column_num="2" placeholder="Patron holds" style="width:95%"/></td>
<td><input type="text" class="filter" data-column_num="3" placeholder="Patron name" style="width:95%"/></td>
<td><input type="text" class="filter" data-column_num="4" placeholder="Title" style="width:95%"/></td>
<td id="homebranchfilter"></td>
<td></td>
<td><input type="text" class="filter" data-column_num="7" placeholder="Call number" style="width:95%"/></td>
<td><input type="text" class="filter" data-column_num="8" placeholder="Available copy" style="width:95%"/></td>
<td><input type="text" class="filter" data-column_num="9" placeholder="Available enumeration" style="width:95%"/></td>
<td id="itemtype-filter"></td>
<td id="locationfilter"></td>
<td></td>
<td></td>
<td id="pickup-location"></td>
<td></td>
</tr>
</tfoot>
</table>
[% ELSE %]
<strong>No items found.</strong>
[% END %]
</div>
</main>
</div> <!-- /.col-sm-10.col-sm-push-2 -->
<div class="col-sm-2 col-sm-pull-10">
<aside>
<div id="filters">
<form action="/cgi-bin/koha/circ/pendingreserves.pl" method="post" >
<fieldset class="brief">
<h4>Refine results</h4>
<ol>
<li>
<label for="from">
Start date:
</label>
<input type="text" size="10" id="from" name="from" value="[% from | html %]" class="flatpickr" data-date_to="to" />
</li>
<li><label for="to">
End date:
</label>
<input type="text" size="10" id="to" name="to" value="[% to | html %]" class="flatpickr" />
</li>
</ol>
[% IF ( HoldsToPullEndDate ) %]
<p><em>(Inclusive, default is [% HoldsToPullStartDate | html %] days ago to [% HoldsToPullEndDate | html %] days ahead. Set other date ranges as needed.)</em></p>
[% ELSE %]
<p><em>(Inclusive, default is [% HoldsToPullStartDate | html %] days ago to today. Set other date ranges as needed.)</em></p>
[% END %]
<fieldset class="action"><input type="submit" name="run_report" value="Submit" class="submit"/></fieldset>
</fieldset>
</form>
</div>
</aside>
</div> <!-- /.col-sm-2.col-sm-pull-10 -->
</div> <!-- /.row -->
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'calendar.inc' %]
[% INCLUDE 'datatables.inc' %]
[% INCLUDE 'columns_settings.inc' %]
<script>
$(document).ready(function() {
var table_settings = [% TablesSettings.GetTableSettings('circ', 'holds', 'holds-to-pull', 'json') | $raw %];
var holdst = KohaTable("holdst", {
"sPaginationType": "full_numbers"
}, table_settings);
holdst.fnAddFilters("filter");
[%# add separateData function to cleanse jQuery select lists by breaking apart strings glued with BR tags and then de-duplicating any repeated library codes %]
function separateData ( ColumnData ){
var cD = ColumnData;
var new_array = new Array();
for ( j=0 ; j<cD.length ; j++ ) {
var split_array = cD[j].split(/\n/gi);
for ( k=0 ; k<split_array.length ; k++ ){
var str = $.trim(split_array[k].replace(/[\n\r]/g, ''));
if ($.inArray(str, new_array) == -1 && str.length > 0 ) {
new_array.push(str);
}
}
}
new_array.sort();
return new_array;
}
[%# add SeparateData function into createSelect function, so that it does the createSelect on clean data %]
function createSelect( data ) {
data = separateData(data);
var r='<select style="width:99%"><option value="">' + _("None") + '</option>', i, len=data.length;
var regex = /(<([^>]+)>)/ig; // Remove html tags
for ( i=0 ; i<len ; i++ ) {
var cell_val = data[i].replace(regex, '');
if ( cell_val.length < 1 ) continue;
r += '<option value="'+cell_val+'">'+cell_val+'</option>';
}
return r+'</select>';
}
$("#homebranchfilter").each( function () {
$(this).html( createSelect( holdst.fnGetColumnData(5) ) );
$('select', this).change( function () {
holdst.fnFilter( $(this).val(), 5 );
});
});
$("#itemtype-filter").each( function () {
$(this).html( createSelect( holdst.fnGetColumnData(10) ) );
$('select', this).change( function () {
holdst.fnFilter( $(this).val(), 10 );
});
});
$("#locationfilter").each( function () {
$(this).html( createSelect( holdst.fnGetColumnData(11) ) );
$('select', this).change( function () {
holdst.fnFilter( $(this).val(), 11 );
});
});
$("#pickup-location").each( function () {
$(this).html( createSelect( holdst.fnGetColumnData(14) ) );
$('select', this).change( function () {
holdst.fnFilter( $(this).val(), 14 );
});
});
});
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]