345 lines
15 KiB
Plaintext
345 lines
15 KiB
Plaintext
[% USE raw %]
|
|
[% USE Koha %]
|
|
[% USE Asset %]
|
|
[% PROCESS 'i18n.inc' %]
|
|
[% SET footerjs = 1 %]
|
|
[% PROCESS 'merge-record.inc' %]
|
|
[% INCLUDE 'doc-head-open.inc' %]
|
|
<title
|
|
>[% FILTER collapse %]
|
|
[% t("Merging records") | html %]
|
|
› [% t("Cataloging") | html %] › [% t("Koha") | html %]
|
|
[% END %]</title
|
|
>
|
|
[% INCLUDE 'doc-head-close.inc' %]
|
|
<style nonce="[% Koha.CSPNonce | $raw %]">
|
|
div.record ul,
|
|
div.record li {
|
|
float: none;
|
|
display: block;
|
|
}
|
|
div#result {
|
|
margin-top: 3.5rem;
|
|
}
|
|
div#mergetarget {
|
|
margin-top: 0.4rem;
|
|
}
|
|
/* We use this style "against" the li ui-tabs-nav style automatically applied */
|
|
#dataPreview {
|
|
width: 80%;
|
|
}
|
|
@media (max-width: 767px) {
|
|
#dataPreview {
|
|
margin: 0;
|
|
width: auto;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body id="cat_merge" class="cat">
|
|
[% WRAPPER 'header.inc' %]
|
|
[% INCLUDE 'cataloging-search.inc' %]
|
|
[% END %]
|
|
|
|
[% WRAPPER 'sub-header.inc' %]
|
|
[% WRAPPER breadcrumbs %]
|
|
[% WRAPPER breadcrumb_item %]
|
|
<a href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cataloging</a>
|
|
[% END %]
|
|
[% WRAPPER breadcrumb_item bc_active= 1 %]
|
|
<span>Merging records</span>
|
|
[% END %]
|
|
[% END #/ WRAPPER breadcrumbs %]
|
|
[% END #/ WRAPPER sub-header.inc %]
|
|
|
|
[% WRAPPER 'main-container.inc' %]
|
|
<h1>Merging records</h1>
|
|
[% IF ( result ) %]
|
|
[% IF ( errors.size ) %]
|
|
[% FOREACH error IN errors %]
|
|
<div class="alert alert-warning">
|
|
[% IF error.code == 'CANNOT_MOVE' %]
|
|
The following items could not be moved from the old record to the new one: [% error.value | html %]
|
|
[% ELSE %]
|
|
[% error | html %]
|
|
[% END %]
|
|
<br />
|
|
Therefore, the record to be merged has not been deleted.
|
|
</div>
|
|
[% END %]
|
|
[% ELSE %]
|
|
<div class="alert alert-info">The merge was successful. <a href="/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=[% ref_biblionumber | uri %]">View the merged record.</a></div>
|
|
<div class="page-section">
|
|
<h3>Report</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Biblionumber</th>
|
|
[% FOREACH key IN report_header.keys.sort %]
|
|
[% tag = key.substr(0, 3) %]
|
|
[% code = key.substr(3, 1) %]
|
|
[% IF code == '@' %]
|
|
[% header = tag %]
|
|
[% ELSE %]
|
|
[% header = tag _ '$' _ code %]
|
|
[% END %]
|
|
<th>[% header | html %]</th>
|
|
[% END %]
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
[% FOREACH record IN report_records %]
|
|
<tr>
|
|
<td>
|
|
[% record.biblionumber | html %]
|
|
[% IF loop.first %]
|
|
<span>(record kept)</span>
|
|
[% END %]
|
|
</td>
|
|
[% FOREACH key IN report_header.keys.sort %]
|
|
<td>
|
|
[% values = record.fields.$key %]
|
|
[% IF values %]
|
|
[% FOREACH value IN record.fields.$key %]
|
|
[% value | html %]
|
|
[% UNLESS loop.last %]<br />[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
</td>
|
|
[% END %]
|
|
</tr>
|
|
[% END %]
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- /.page-section -->
|
|
[% END %]
|
|
[% ELSE %]
|
|
|
|
[% IF ( choosereference ) %]
|
|
<p>Please choose which record will be the reference for the merge. The record chosen as reference will be kept, and the other will be deleted.</p>
|
|
<form id="mergeform_ref" action="/cgi-bin/koha/cataloguing/merge.pl" method="get">
|
|
<fieldset class="rows">
|
|
<legend>Merge reference</legend>
|
|
<ol>
|
|
[% FOREACH record IN records %]
|
|
<li class="radio">
|
|
[% IF loop.first %]
|
|
<input
|
|
type="radio"
|
|
value="[% record.biblionumber | html %]"
|
|
checked="checked"
|
|
id="ref_biblionumber[% record.biblionumber | html %]"
|
|
name="ref_biblionumber"
|
|
class="change_framework"
|
|
data-framework="[% record.frameworkcode | html %]"
|
|
/>
|
|
[% SET selected_frameworkcode = record.frameworkcode %]
|
|
[% ELSE %]
|
|
<input
|
|
type="radio"
|
|
value="[% record.biblionumber | html %]"
|
|
id="ref_biblionumber[% record.biblionumber | html %]"
|
|
name="ref_biblionumber"
|
|
class="change_framework"
|
|
data-framework="[% record.frameworkcode | html %]"
|
|
/>
|
|
[% END %]
|
|
<label for="ref_biblionumber[% record.biblionumber | html %]">
|
|
[% INCLUDE 'biblio-title.inc' biblio=record.data link = 1 %] ([% record.biblionumber | uri %])
|
|
<a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% record.biblionumber | uri %]" class="previewData">View MARC</a>
|
|
</label>
|
|
</li>
|
|
[% END %]
|
|
|
|
<li>
|
|
<label for="frameworkcode">Using framework:</label>
|
|
<select name="frameworkcode" id="frameworkcode">
|
|
<option value="">Default</option>
|
|
[% FOREACH framework IN frameworks %]
|
|
<option value="[% framework.frameworkcode | html %]" [% IF framework.frameworkcode == selected_frameworkcode %]selected="selected"[% END %]>[% framework.frameworktext | html %]</option>
|
|
[% END %]
|
|
</select>
|
|
</li>
|
|
</ol>
|
|
|
|
[% FOREACH record IN records %]
|
|
<input type="hidden" name="biblionumber" value="[% record.biblionumber | html %]" />
|
|
[% END %]
|
|
</fieldset>
|
|
<fieldset class="action">
|
|
<input type="submit" class="btn btn-primary" value="Next" />
|
|
</fieldset>
|
|
</form>
|
|
|
|
<div id="dataPreview" class="modal" tabindex="-1" role="dialog" aria-labelledby="dataPreviewLabel" aria-hidden="true">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h1 class="modal-title" id="dataPreviewLabel">Preview</h1>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div id="loading"> <img src="[% interface | html %]/[% theme | html %]/img/spinner-small.gif" alt="" /> Loading </div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button class="btn btn-default" data-bs-dismiss="modal">Close</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
[% ELSE %]
|
|
[% IF ( errors.size ) %]
|
|
<div class="alert alert-warning">
|
|
[% FOREACH error IN errors %]
|
|
<p>[% error | html %]</p>
|
|
[% END %]
|
|
</div>
|
|
[% ELSE %]
|
|
<form id="mergeform" action="/cgi-bin/koha/cataloguing/merge.pl" method="post" onsubmit="return mergeformsubmit()">
|
|
[% INCLUDE 'csrf-token.inc' %]
|
|
<div class="row">
|
|
<div class="col-sm-6" id="sourcerecords"> [% PROCESS mergesource sourcerecords=records %] </div>
|
|
<div class="col-sm-6" id="mergetarget"> [% PROCESS mergetarget %] </div>
|
|
<!-- .col-sm-6 -->
|
|
</div>
|
|
<input type="hidden" name="ref_biblionumber" value="[% ref_biblionumber | html %]" />
|
|
[% FOREACH record IN records %]
|
|
<input type="hidden" name="biblionumber" value="[% record.recordid | html %]" />
|
|
[% END %]
|
|
<input type="hidden" name="frameworkcode" value="[% framework | html %]" />
|
|
|
|
<fieldset class="action">
|
|
<input type="hidden" name="op" value="cud-merge" />
|
|
<input type="submit" name="merge" class="btn btn-primary" value="Merge" />
|
|
<label for="report_fields">Fields to display in report:</label>
|
|
<input type="text" name="report_fields" id="report_fields" value="[% MergeReportFields | html %]" />
|
|
<span class="hint">(Example: "001,245ab,600")</span>
|
|
</fieldset>
|
|
</form>
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% MACRO jsinclude BLOCK %]
|
|
[% Asset.js("js/merge-record.js") | $raw %]
|
|
<script nonce="[% Koha.CSPNonce | $raw %]">
|
|
[% UNLESS (result) %]
|
|
[% IF (choosereference) %]
|
|
function changeFramework(fw) {
|
|
$("#frameworkcode").val(fw);
|
|
}
|
|
$(document).ready(function(){
|
|
$(".previewData").on("click", function(e){
|
|
e.preventDefault();
|
|
var ltitle = $(this).text();
|
|
var page = $(this).attr("href");
|
|
$("#dataPreviewLabel").text(ltitle);
|
|
$("#dataPreview .modal-body").load(page + " div");
|
|
$('#dataPreview').modal("show");
|
|
});
|
|
$("#dataPreview").on("hidden.bs.modal", function(){
|
|
$("#dataPreviewLabel").html("");
|
|
$("#dataPreview .modal-body").html("<div id=\"loading\"><img src=\"[% interface | html %]/[% theme | html %]/img/spinner-small.gif\" alt=\"\" /> "+_("Loading")+"</div>");
|
|
});
|
|
$(".change_framework").on("click", function(){
|
|
let framework = $(this).data("framework");
|
|
changeFramework( framework );
|
|
});
|
|
});
|
|
[% ELSE %]
|
|
function check_mandatory () {
|
|
var missing = {
|
|
'fields': [],
|
|
'subfields': []
|
|
};
|
|
for (tag in tagslib) {
|
|
if (tag == '000' || tag == '001')
|
|
continue;
|
|
if (tagslib[tag].mandatory == 1) {
|
|
if ($("#resultul span.field:contains("+ tag +")").length == 0) {
|
|
missing.fields.push(tag);
|
|
}
|
|
}
|
|
for (subfieldcode in tagslib[tag]) {
|
|
if (subfieldcode == 'lib' || subfieldcode == 'mandatory'
|
|
|| subfieldcode == 'repeatable' || subfieldcode == 'tab'
|
|
|| subfieldcode == '@') {
|
|
continue;
|
|
}
|
|
if (tagslib[tag][subfieldcode].mandatory == 1 && tagslib[tag][subfieldcode].tab >= 0) {
|
|
var fields = $("#resultul span.field:contains("+ tag +")");
|
|
$(fields).each(function() {
|
|
var subfields = $(this).parents('li').find("span.subfield:contains("+ subfieldcode +")");
|
|
if (subfields.length == 0) {
|
|
missing.subfields.push( {
|
|
'tag': tag,
|
|
'subfieldcode': subfieldcode
|
|
} );
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return missing;
|
|
}
|
|
|
|
// When submitting the form
|
|
function mergeformsubmit() {
|
|
var missing = check_mandatory();
|
|
var alert_msg = '';
|
|
var error = 0;
|
|
if (missing.fields.length > 0) {
|
|
alert_msg += _("Following required fields are missing:") + "\n";
|
|
for (var i in missing.fields) {
|
|
alert_msg += "\t- " + missing.fields[i] + "\n";
|
|
error ++;
|
|
}
|
|
alert_msg += "\n";
|
|
}
|
|
if (missing.subfields.length > 0) {
|
|
alert_msg += _("Following required subfields are missing:") + "\n";
|
|
for (var i in missing.subfields) {
|
|
var subfield = missing.subfields[i];
|
|
alert_msg += "\t- " + subfield.tag + "$" + subfield.subfieldcode + "\n";
|
|
error ++;
|
|
}
|
|
}
|
|
|
|
if (error != 0) {
|
|
alert(alert_msg);
|
|
return false;
|
|
} else {
|
|
$("#tabs").remove();
|
|
}
|
|
}
|
|
|
|
$(document).ready(function(){
|
|
tagslib = [];
|
|
$.getJSON("/cgi-bin/koha/cataloguing/merge_ajax.pl", {frameworkcode : "[% framework | html %]" }, function(json) {
|
|
tagslib = json;
|
|
rebuild_target($("#tabs"), $("#resultul"));
|
|
});
|
|
|
|
if( $("#tabs .tab-pane.active").length < 1 ){
|
|
$("#tabs a:first").tab("show");
|
|
}
|
|
|
|
// Uncheck all checkboxes in both tabs, then check all checkboxes in first tab
|
|
// to avoid inconsistencies from a page refresh.
|
|
$("#tabs input[type='checkbox']").prop("checked", false);
|
|
$("#tabrecord[% ref_biblionumber | html %]_panel input[type='checkbox']").prop("checked", true );
|
|
|
|
//Set focus to cataloging search
|
|
$("input[name=q]:eq(0)").focus();
|
|
});
|
|
|
|
[% END %]
|
|
[% END %]
|
|
</script>
|
|
[% END %]
|
|
|
|
[% INCLUDE 'intranet-bottom.inc' %]
|