Koha/koha-tmpl/intranet-tmpl/prog/en/modules/course_reserves/course-details.tt
Kyle M Hall 7d15ff3404
Bug 23727: Editing course reserve items is broken
Adding an item to course reserves and trying to edit any values in a second step does not work. Values are not saved and the table shows all values as "Unchanged".

This patch set adds two new sets of columns to the course_items table.

The first set determines if the specified column should be swapped or
not. The was previously 'implied' by the column being set to undef which
has been the root problem with that way of knowing if a column should
swap or not.

The second set of new columns are for storing the item field values
while the item is on course reserve. Previously, the column values
were swapped between the items table and the course_items table,
which leaves ambiguity as to what each value is. Now, the original
columns *always* store the value when the item is on course reserve,
and the new storage columns store the original item value while the
item is on reserve, and are NULL when an item is *not* on reserve.

Test Plan:
1) Apply this patch
2) Add and edit course items, not the new checkboxes for enabling fields
3) Everything should function as before

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
2020-04-17 13:45:56 +01:00

286 lines
16 KiB
Text

[% USE raw %]
[% USE Asset %]
[% USE AuthorisedValues %]
[% USE ItemTypes %]
[% USE Branches %]
[% USE ColumnsSettings %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha &rsaquo; Course reserves &rsaquo; Course details for [% course.course_name | html %]</title>
[% INCLUDE 'doc-head-close.inc' %]
<style>
#instructors {
float: left;
}
.instructor_line {
padding: 0 .1em;
}
</style>
</head>
<body id="courses_course_details" class="course">
[% INCLUDE 'header.inc' %]
[% INCLUDE 'cat-search.inc' %]
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/course_reserves/course-reserves.pl">Course reserves</a> &rsaquo; Course details for <i>[% course.course_name | html %]</i></div>
<div class="main container-fluid">
<div class="row">
<div class="col-md-10 col-md-offset-1">
[% IF CAN_user_coursereserves_add_reserves OR CAN_user_coursereserves_manage_courses OR CAN_user_coursereserves_manage_courses %]
<div id="toolbar">
[% IF CAN_user_coursereserves_add_reserves %]
<a class="btn btn-default" id="add_items" href="/cgi-bin/koha/course_reserves/add_items.pl?course_id=[% course.course_id | html %]"><i class="fa fa-plus"></i> Add reserves</a>
<a class="btn btn-default" id="add_items" href="/cgi-bin/koha/course_reserves/batch_add_items.pl?course_id=[% course.course_id | html %]"><i class="fa fa-plus"></i> Batch add reserves</a>
[% END %]
[% IF ( CAN_user_coursereserves_manage_courses ) %]
<a class="btn btn-default" id="edit_course" href="/cgi-bin/koha/course_reserves/course.pl?course_id=[% course.course_id | html %]"><i class="fa fa-pencil"></i> Edit course</a>
[% END %]
[% IF ( CAN_user_coursereserves_manage_courses ) %]
<a class="btn btn-default" id="delete_course" href="/cgi-bin/koha/course_reserves/mod_course.pl?course_id=[% course.course_id | html %]&amp;action=del"><i class="fa fa-trash"></i> Delete course</a>
[% END %]
</div><!-- /toolbar -->
[% END %]
<div class="rows">
<ol>
<li><span class="label">Course name</span> [% course.course_name | html %]</li>
<li><span class="label">Term</span> [% AuthorisedValues.GetByCode( 'TERM', course.term ) | html %]</li>
<li><span class="label">Department</span> [% AuthorisedValues.GetByCode( 'DEPARTMENT', course.department ) | html %]</li>
<li><span class="label">Course number</span> [% course.course_number | html %]</li>
<li><span class="label">Section</span> [% course.section | html %]</li>
<li>
<span class="label">Instructors</span>
<div id="instructors">
[% FOREACH i IN course.instructors %]
<div class="instructor_line">
<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% i.borrowernumber | uri %]">[% i.firstname | html %] [% i.surname | html %]</a>
</div>
[% END %]
</div>
</li>
<li><span class="label">Staff note</span> [% course.staff_note | html %]</li>
<li><span class="label">Public note</span> [% course.public_note | $raw %]</li>
<li><span class="label">Student count</span> [% course.students_count | html %]</li>
<li><span class="label">Status</span> [% IF course.enabled == 'yes' %]Active[% ELSE %]Inactive[% END %]</li>
</ol>
</div>
[% IF course_reserves %]
<h1>Reserves</h1>
<table id="course_reserves_table">
<thead>
<tr>
<th class="antithe">Title</th>
<th>Author</th>
<th>Barcode</th>
<th>Call number</th>
[% IF item_level_itypes %]<th>Item type</th>[% END %]
<th>Collection</th>
<th>Location</th>
<th>Library</th>
<th>Staff note</th>
<th>Public note</th>
<th>Link</th>
<th class="NoSort">Other course reserves</th>
<th>Status</th>
[% IF CAN_user_coursereserves_add_reserves || CAN_user_coursereserves_delete_reserves %]
<th class="NoSort">Actions</th>
[% END %]
</tr>
</thead>
<tbody>
[% FOREACH cr IN course_reserves %]
<tr>
<td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% cr.biblio.biblionumber | uri %]">[% INCLUDE 'biblio-title.inc' biblio=cr.biblio %]</a></td>
<td>[% cr.biblio.author | html %]</td>
<td><a href="/cgi-bin/koha/catalogue/moredetail.pl?itemnumber=[% cr.item.itemnumber | uri %]&amp;biblionumber=[% cr.biblio.biblionumber | uri %]&amp;bi=[% cr.biblioitem.biblioitemnumber | uri %]">[% cr.item.barcode | html %]</a></td>
<td>[% cr.item.itemcallnumber | html %]</td>
[% IF item_level_itypes %]
<td>
[% IF cr.course_item.itype_enabled %]
[% IF cr.course_item.enabled == 'yes' %]
<strong>[% ItemTypes.GetDescription( cr.item.effective_itemtype ) | html %]</strong>
([% ItemTypes.GetDescription( cr.course_item.itype_storage ) | html %])
[% ELSE %]
[% ItemTypes.GetDescription( cr.course_item.itype ) | html %]
(<strong>[% ItemTypes.GetDescription( cr.item.effective_itemtype) | html %]</strong>)
[% END %]
[% ELSE %]
<i>Unchanged</i>
[% IF cr.item.itype %]
([% ItemTypes.GetDescription( cr.item.itype ) | html %])
[% END %]
[% END %]
</td>
[% END %]
<td>
[% IF cr.course_item.ccode_enabled %]
[% IF cr.course_item.enabled == 'yes' %]
<strong>[% AuthorisedValues.GetByCode( 'CCODE', cr.item.ccode ) | html %]</strong>
[% IF cr.item.ccode %]
([% AuthorisedValues.GetByCode( 'CCODE', cr.course_item.ccode_storage ) | html %])
[% END %]
[% ELSE %]
[% AuthorisedValues.GetByCode( 'CCODE', cr.course_item.ccode ) | html %]
[% IF cr.item.ccode %]
(<strong>[% AuthorisedValues.GetByCode( 'CCODE', cr.item.ccode ) | html %]</strong>)
[% END %]
[% END %]
[% ELSE %]
<i>Unchanged</i>
[% IF cr.item.ccode %]
([% AuthorisedValues.GetByCode( 'CCODE', cr.item.ccode ) | html %])
[% END %]
[% END %]
</td>
<td>
[% IF cr.course_item.location_enabled %]
[% IF cr.course_item.enabled == 'yes' %]
<strong>[% AuthorisedValues.GetByCode( 'LOC', cr.item.permanent_location ) | html %]</strong>
[% IF cr.item.permanent_location %]
([% AuthorisedValues.GetByCode( 'LOC', cr.course_item.location_storage ) | html %])
[% END %]
[% ELSE %]
[% AuthorisedValues.GetByCode( 'LOC', cr.course_item.location ) | html %]
[% IF cr.item.permanent_location %]
(<strong>[% AuthorisedValues.GetByCode( 'LOC', cr.item.permanent_location ) | html %]</strong>)
[% END %]
[% END %]
[% ELSE %]
<i>Unchanged</i>
[% IF cr.item.permanent_location %]
([% AuthorisedValues.GetByCode( 'LOC', cr.item.permanent_location ) | html %])
[% END %]
[% END %]
</td>
<td>
[% IF cr.course_item.holdingbranch_enabled %]
[% IF cr.course_item.enabled == 'yes' %]
<strong>[% Branches.GetName( cr.item.holdingbranch ) | html %]</strong>
[% IF cr.item.holdingbranch %]
([% Branches.GetName( cr.course_item.holdingbranch_storage ) | html %])
[% END %]
[% ELSE %]
[% Branches.GetName( cr.course_item.holdingbranch ) | html %]
[% IF cr.item.holdingbranch %]
(<strong>[% Branches.GetName( cr.item.holdingbranch ) | html %]</strong>)
[% END %]
[% END %]
[% ELSE %]
<i>Unchanged</i>
[% IF cr.item.holdingbranch %]
([% Branches.GetName( cr.item.holdingbranch ) | html %])
[% END %]
[% END %]
</td>
<td>[% IF (cr.staff_note) %]
[% cr.staff_note | html %]
[% ELSIF (cr.item.itemnotes_nonpublic) %]
[% cr.item.itemnotes_nonpublic | html %]
[% END %]
</td>
<td>[% IF (cr.public_note) %]
[% cr.public_note | $raw %]
[% ELSIF (cr.item.itemnotes) %]
[% cr.item.itemnotes | $raw %]
[% END %]
</td>
<td>
[% IF (cr.item.uri) %]
<a href="[% cr.item.uri | url %]">Item URI</a>
[% ELSIF (cr.biblioitem.url) %]
<a href="[% cr.biblioitem.url | url %]">Record URL</a>
[% END %]
</td>
<td>
[% FOREACH c IN cr.courses %]
[% UNLESS cr.course_id == c.course_id %]
<p>
<a href="course-details.pl?course_id=[% c.course_id | uri %]">
[% c.course_name | html %]
[% IF c.section %] [% c.section | html %] [% END %]
[% IF c.term %] [% AuthorisedValues.GetByCode( 'TERM', c.term ) | html %] [% END %]
</a>
</p>
[% END %]
[% END %]
</td>
<td class="status">
<span>
[% IF cr.item.onloan %]
Checked out
[% ELSE %]
Available
[% END %]
</span>
</td>
[% IF CAN_user_coursereserves_add_reserves || CAN_user_coursereserves_delete_reserves %]
<td class="actions">
[% IF CAN_user_coursereserves_add_reserves %]
<a class="btn btn-default btn-xs" href="add_items.pl?course_id=[% course.course_id | html %]&amp;itemnumber=[% cr.item.itemnumber | html %]&amp;action=lookup&amp;return=[% course.course_id | html %]&amp;is_edit=1"><i class="fa fa-pencil"></i> Edit</a>
[% END %]
[% IF CAN_user_coursereserves_delete_reserves %]
<a class="btn btn-default btn-xs delete_item" href="course-details.pl?course_id=[% course.course_id | html %]&amp;action=del_reserve&amp;cr_id=[% cr.cr_id | html %]">
<i class="fa fa-trash"></i> Remove</a>
[% END %]
</td>
[% END %]
</tr>
[% END %]
</tbody>
</table>
[% END %]
</div>
</div>
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'datatables.inc' %]
[% INCLUDE 'columns_settings.inc' %]
<script>
var columns_settings = [% ColumnsSettings.GetColumns( 'coursereserves', 'reserves', 'course_reserves_table', 'json' ) | $raw %];
$(document).ready(function(){
var rtable = KohaTable("course_reserves_table", {
"sPaginationType": "full",
"bAutoWidth": false,
"aoColumnDefs": [
{ 'bSortable': false, 'aTargets': [ 'NoSort' ] },
{ 'sType': "anti-the", 'aTargets' : [ 'antithe'] }
]
}, columns_settings );
$(".delete_item").click(function(){
return confirmDelete(_("Are you sure you want to remove this item from the course?"));
});
$("#delete_course").click(function(){
[% SET count = course_reserves.size || 0 %]
[% IF count == 1 %]
return confirmDelete(_("Are you sure you want to delete this course? There is %s attached item.").format([% count | html %]) );
[% ELSIF count > 1 %]
return confirmDelete(_("Are you sure you want to delete this course? There are %s attached items.").format([% count | html %]) );
[% ELSE %]
return confirmDelete(_("Are you sure you want to delete this course?"));
[% END %]
});
$(".disabled").tooltip().on("click", function(e){
e.preventDefault();
if( $(this).hasClass("checkedout") ){
alert(_("This item cannot be removed. It is checked out"));
}
});
});
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]