5 [% INCLUDE 'doc-head-open.inc' %]
6 <title>[% IF ( biblionumber ) %]Editing [% title | html %] (Record number [% biblionumber | html %])[% ELSE %]Add MARC record[% END %] › Cataloging › Koha</title>
7 [% INCLUDE 'doc-head-close.inc' %]
8 [% INCLUDE 'calendar.inc' %]
9 [% Asset.js("lib/hc-sticky.js") | $raw %]
10 [% INCLUDE 'select2.inc' %]
12 [% IF Koha.Preference('CreateAVFromCataloguing') && CAN_user_parameters_manage_auth_values %]
13 var auth_values_creation = 1;
15 var auth_values_creation = 0;
17 $.fn.select2.defaults.set("width", "100%" );
19 [% Asset.js("js/cataloging.js") | $raw %]
20 [% Asset.js("js/browser.js") | $raw %]
22 var browser = KOHA.browser('[% searchid | html %]', parseInt('[% biblionumber | html %]', 10));
25 $(window).load(function(){
29 $(document).ready(function() {
31 [% IF bib_doesnt_exist %]
32 $("#addbibliotabs").hide();
36 $("a[data-toggle='tab']").on("shown.bs.tab", function (e) {
37 $( e.target.hash + " .input_marceditor:visible:eq(0)").focus();
40 /* On page load, check for location.hash in the page URL */
41 /* If present the location hash will be used to activate the correct tab */
42 var hash = location.hash;
43 var hashPieces = hash.split('?');
44 if( hashPieces[0] !== "" ){
45 selectTab( hashPieces[0] );
46 window.scrollTo( 0, 0 );
48 selectTab( "#tab0XX_panel" );
51 $( "ul.sortable_field", "#addbibliotabs" ).sortable({
53 containment: $("#addbibliotabs")
55 $( "ul.sortable_subfield", "#addbibliotabs" ).sortable({
61 hash = "#[% tab | html %]";
65 Sticky = $("#toolbar");
68 stickyClass: "floating"
71 /* check cookie to hide/show marcdocs*/
72 if( Cookies.get("marcdocs_[% borrowernumber | html %]") == 'hide'){
73 toggleMARCdocLinks(false);
75 toggleMARCdocLinks(true);
78 $("#marcDocsSelect").click(function(){
79 if( Cookies.get("marcdocs_[% borrowernumber | html %]") == 'hide'){
80 toggleMARCdocLinks(true);
82 toggleMARCdocLinks(false);
86 /* check cookie to hide/show marc tags*/
87 var marctags_cookie = Cookies.get("marctags_[% borrowernumber | html %]");
88 if( marctags_cookie == 'hide'){
89 toggleMARCTagLinks(false);
90 } else if( marctags_cookie == 'show'){
91 toggleMARCTagLinks(true)
93 [% UNLESS Koha.Preference("hide_marc") %]
94 toggleMARCTagLinks(true)
96 toggleMARCTagLinks(false);
100 $("#marcTagsSelect").click(function(){
101 if( Cookies.get("marctags_[% borrowernumber | html %]") == 'hide'){
102 toggleMARCTagLinks(true)
104 toggleMARCTagLinks(false);
108 $("#z3950search").click(function(){
112 $("#linkerbutton").click(function(){
116 $("#saverecord").click(function(){
117 $(".btn-group").removeClass("open");
122 $("#saveandview").click(function(){
123 $(".btn-group").removeClass("open");
128 $("#saveanditems").click(function(){
129 $(".btn-group").removeClass("open");
133 $("#saveandcontinue").click(function(){
134 $(".btn-group").removeClass("open");
135 var tab = $("#addbibliotabs div.active:first").attr('id');
136 $("#current_tab").val(tab);
137 redirect("just_save", tab);
141 $( '#switcheditor' ).click( function() {
142 var breedingid = [% breedingid || "null" | html %];
144 if ( !confirm( breedingid ? _("This record cannot be transferred to the advanced editor. Continue?") : _("Any changes will not be saved. Continue?") ) ) return false;
146 Cookies.set( 'catalogue_editor_[% logged_in_user.borrowernumber | html %]', 'advanced', { expires: 365, path: '/', sameSite: 'Lax' } );
148 var biblionumber = [% biblionumber || "null" | html %];
150 if ( biblionumber ) {
151 window.location = '/cgi-bin/koha/cataloguing/editor.pl#catalog/' + biblionumber;
153 window.location = '/cgi-bin/koha/cataloguing/editor.pl';
158 $(".change-framework").on("click", function(){
159 var frameworkcode = $(this).data("frameworkcode");
160 $("#frameworkcode").val( frameworkcode );
164 $(".toolbar-tabs-container .nav-tabs a").on("click",function(e){
166 selectTab( this.hash );
169 $(".tag_anchor").on("click", function(e){
171 $(".tag_anchor").removeClass("selected");
172 $(this).addClass("selected");
173 var link = this.href;
174 var linkid = link.substring( link.indexOf("#") + 1 );
175 window.scrollTo( 0, getScrollto( linkid, "toolbar" ) );
178 $("body").on("click", ".linkfield", function(e){
180 var tab = $(this).data("tab");
181 var field = $(this).data("field");
182 var tablink = $("a[data-tabname='tab" + tab + "XX']" ).get(0).hash;
183 selectTab( tablink );
184 window.scrollTo( 0, getScrollto( field, "toolbar" ) );
187 $("body").on("click", ".show-errors", function(e){
188 document.getElementById("form-errors").scrollIntoView();
193 function selectTab( tablink ){
194 /* return if no tabs displayed (fast add framework) */
195 if ($(".toolbar-tabs-container .nav-tabs li").length === 0){
198 let a = $("a[href='" + tablink + "']");
199 $(".toolbar-tabs-container .nav-tabs li").removeClass("selected");
200 a.tab("show").parent().addClass("selected");
201 /* Get number from string like "tab9XX" */
202 var tabid = a.data("tabname").substring(3, 4);
203 $(".tag_anchors").removeClass("tab_selected").hide();
204 $(".tag_anchors_" + tabid ).addClass("tab_selected").show();
208 * Returns a roughly ideal position to scroll an element into view
209 * @param {string} target - The HTML id of the element to scroll into view
210 * @param {string} elemid - The HTML id of the element which might obscure
211 * the view of the target element e.g. a floating toolbar
212 * @return {number} - The y-coordinate to pass to window.scrollTo()
214 function getScrollto( target, elemid ){
215 var dest = $("#" + target );
216 var yoffset = dest.offset();
219 var element = $("#" + elemid );
220 var elem_height = element.outerHeight();
224 return yoffset.top - elem_height - 20;
227 function redirect(dest){
228 $("#redirect").attr("value",dest);
232 [% IF ( CAN_user_editcatalogue_edit_items ) %]
233 var onOption = function () {
239 * this function append button for create new authority if not found
242 function addCreateAuthorityButton(tag_subfield_line, heading, tag_index) {
243 var title = _("Create authority");
244 var elem = $('<a href="#" title="' + title + '"><i class="fa fa-plus-circle"></i></a>');
245 tag_subfield_line.append(elem);
246 var tag_subfield_line_a = $('.subfield_line[id^=subfield' + heading.tag + 'a]').eq(tag_index);
247 var subfield_a = tag_subfield_line_a.find('.input_marceditor').eq(0);
248 var index = subfield_a.attr('id');
249 elem.click(function() {
250 var popup = window.open("", "new_auth_popup",'fullscreen,toolbar=false,scrollbars=yes');
252 // Create a new form that will be POSTed in the new window
253 var form = $('<form>').attr({
255 action: "/cgi-bin/koha/authorities/authorities.pl",
256 target: "new_auth_popup"
258 //add the authtypecode
259 form.append($('<input>').attr({
261 name: 'authtypecode',
262 value: heading.auth_type
264 form.append($('<input>').attr({
267 value: heading.tag_to_report
269 form.append($('<input>').attr({
274 form.append($('<input>').attr({
279 $('.tag[id^=tag_' + heading.tag + '_]').eq(tag_index).find(':input').each(function(){
280 form.append($('<input>').attr({
282 name: this.name.split('_',4).join(''),
286 $('body').append(form);
296 * Updates the authid for every heading field
297 * Adds visual feedback for the changes made on the form.
299 function updateHeadingLinks(links) {
300 var current_tag = '';
303 // Delete the old message dialog and create a new one
304 $('#autolinker_dialog').remove();
305 var message_dialog = $('<div id="autolinker_dialog" class="dialog message"><strong>' + _("Automatic authority link results:") + '</strong><ul></ul></div>');
306 var message_dialog_ul = message_dialog.find('ul');
308 $.each(links, function(index, heading) {
309 if(current_tag == heading.tag) {
313 current_tag = heading.tag;
317 // Find the $9 field to update
318 var tag_subfield_line = $('.subfield_line[id^=subfield' + heading.tag + '9]').eq(tag_index);
319 if( tag_subfield_line.length < 1 ){ return; }
321 var subfield = tag_subfield_line.find('.input_marceditor').eq(0);
322 subfield.removeClass("matching_authority_field no_matching_authority_field");
324 // Delete the old status if one exists
325 tag_subfield_line.children('.subfield_status').remove();
327 // If the field wasn't modified. Skip it.
328 if(heading.status == 'UNCHANGED') {
333 // Make the subfield line visible and update its value
334 tag_subfield_line.show();
335 subfield.val(heading.authid);
337 // Add the new status
338 var image = '<i class="fa fa-close subfield_status no_matching_authority" </i> ';
340 var field_class = 'no_matching_authority_field';
341 switch(heading.status) {
343 image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
344 message = _("A matching authority was found in the local database.");
345 field_class = 'matching_authority_field';
348 image = '<i class="fa fa-check subfield_status matching_authority"></i> ';
349 message = _("No matching authority found. A new authority was created automatically.");
350 field_class = 'matching_authority_field';
352 case 'MULTIPLE_MATCH':
353 message = _("More than one local match found. Possibly a duplicate authority!");
356 message = _("No matching authority found.");
359 message = heading.status;
363 subfield[0].classList.add(field_class);
364 tag_subfield_line.find('i').each(function() {
367 tag_subfield_line.append(image);
369 // Add the message to the dialog
370 message_dialog_ul.append('<li><strong>' + heading.tag + '</strong> - ' + message + '</li>');
372 // Add a link to create a new authority if none was found
373 if(heading.status == 'NONE_FOUND' && tag_subfield_line.find('i').length == 1) {
374 addCreateAuthorityButton(tag_subfield_line, heading , tag_index);
378 if(message_dialog.find('li').length == 0) {
379 message_dialog_ul.append("<li>" + _("No authority link was changed.") + "</li>");
381 $('#addbibliotabs').before(message_dialog);
385 * Use an ajax request to automatically find authority links for the current record
387 function AutomaticLinker() {
388 // Show the Loading overlay
389 $("#loading").show();
391 // Remove fields that are completely empty
392 $('#f').find('.tag').each(function() {
394 $(this).find('.input_marceditor').each(function() {
395 if($(this).val() != '') {
401 UnCloneField($(this).attr('id'));
405 // Get all the form values to post via AJAX
407 $('#f').find(':input').each(function(){
408 form_data[this.name] = $(this).val();
410 delete form_data[''];
412 // Send the data to automatic_linker.pl
414 url:'/cgi-bin/koha/svc/cataloguing/automatic_linker.pl',
418 error: function(xhr) {
419 alert("Error : \n" + xhr.responseText);
421 success: function(json) {
422 switch(json.status) {
424 alert(_("Error : You do not have the permissions necessary to use this functionality."));
427 updateHeadingLinks(json.links);
431 complete: function() {
432 $("#loading").hide();
438 function PopupMARCFieldDoc(field) {
439 [% IF Koha.Preference('marcfielddocurl') %]
440 var docurl = "[% Koha.Preference('marcfielddocurl').replace('"','"') | html %]";
441 docurl = docurl.replace("{MARC}", "[% marcflavour | html %]");
442 docurl = docurl.replace("{FIELD}", ""+field);
443 docurl = docurl.replace("{LANG}", "[% lang | html %]");
445 [% ELSIF ( marcflavour == 'MARC21' ) %]
446 _MARC21FieldDoc(field);
447 [% ELSIF ( marcflavour == 'UNIMARC' ) %]
448 _UNIMARCFieldDoc(field);
451 function confirmnotdup(redirect){
452 $("#confirm_not_duplicate").attr("value","1");
453 $("#redirect").attr("value",redirect);
457 function Dopop(link,i) {
458 defaultvalue = document.getElementById(i).value;
459 window.open(link+"&result="+defaultvalue,"valuebuilder",'width=700,height=550,toolbar=false,scrollbars=yes');
463 * this function open a popup to search on z3950 server.
465 function PopupZ3950() {
466 var strQuery = GetZ3950Terms();
468 window.open("/cgi-bin/koha/cataloguing/z3950_search.pl?biblionumber=[% biblionumber | html %]"+strQuery,"z3950search",'width=800,height=550,location=yes,toolbar=no,scrollbars=yes,resize=yes');
472 function _MARC21FieldDoc(field) {
474 window.open("http://www.loc.gov/marc/bibliographic/bdleader.html");
475 } else if (field >= 90 && field <= 99 ){
476 window.open("http://www.loc.gov/marc/bibliographic/bd09x.html");
477 } else if (field >= 590 && field <= 599 ){
478 window.open("http://www.loc.gov/marc/bibliographic/bd59x.html");
479 } else if (field >= 690 && field <= 699 ){
480 window.open("http://www.loc.gov/marc/bibliographic/bd69x.html");
481 } else if (field < 900) {
482 window.open("http://www.loc.gov/marc/bibliographic/bd" + ("000"+field).slice(-3) + ".html");
484 window.open("http://www.loc.gov/marc/bibliographic/bd9xx.html");
488 function _UNIMARCFieldDoc(field) {
489 /* http://archive.ifla.org/VI/3/p1996-1/ is an outdated version of UNIMARC, but
490 seems to be the only version available that can be linked to per tag. More recent
491 versions of the UNIMARC standard are available on the IFLA website only as
496 url = "http://archive.ifla.org/VI/3/p1996-1/uni.htm";
498 var first = field.substring(0,1);
499 url = "http://archive.ifla.org/VI/3/p1996-1/uni" + first + ".htm#";
500 if (first == 0) url = url + "b";
502 ? "http://archive.ifla.org/VI/3/p1996-1/uni9.htm"
509 * Functions to hide/show marc docs and tags links
512 function toggleMARCdocLinks(flag){
514 $(".marcdocs").show();
515 Cookies.set("marcdocs_[% borrowernumber | html %]",'show', { path: "/", expires: 365, sameSite: 'Lax' });
516 $("#marcDocsSelect i").addClass('fa-check-square-o').removeClass('fa-square-o');
518 $(".marcdocs").hide();
519 Cookies.set("marcdocs_[% borrowernumber | html %]",'hide', { path: "/", expires: 365, sameSite: 'Lax' });
520 $("#marcDocsSelect i").removeClass('fa-check-square-o').addClass('fa-square-o');
524 function toggleMARCTagLinks(flag){
527 $(".subfieldcode").show();
528 Cookies.set("marctags_[% borrowernumber | html %]",'show', { path: "/", expires: 365, sameSite: 'Lax' });
529 $("#marcTagsSelect i").addClass('fa-check-square-o').removeClass('fa-square-o');
532 $(".subfieldcode").hide();
533 Cookies.set("marctags_[% borrowernumber | html %]",'hide', { path: "/", expires: 365, sameSite: 'Lax' });
534 $("#marcTagsSelect i").removeClass('fa-check-square-o').addClass('fa-square-o');
539 * check if mandatory/important subfields are written
540 * @param mandatory true to check for mandatories, false for importants
542 function AreFieldsNotOk (mandatory = true) {
543 var fields = new Array();
544 var subfields = new Array();
545 var tab = new Array();
546 var label = new Array();
548 var tabflag= new Array();
549 var StrAlert = "<div id='form-errors' class='dialog alert list'>";
550 var notFilledClass = "subfield_not_filled";
553 [% FOREACH BIG_LOO IN BIG_LOOP %]
554 [% FOREACH innerloo IN BIG_LOO.innerloop %]
555 [% IF ( innerloo.mandatory ) %]
556 fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"));
558 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
559 [% IF ( subfield_loo.mandatory ) %]subfields.push("[% subfield_loo.id | html %]");
560 tab.push("[% BIG_LOO.number | html %]");
561 label.push("[% subfield_loo.marc_lib | $raw %]");
566 StrAlert += "<h4>" + _("The following mandatory subfields aren't filled:") + "</h4>";
568 [% FOREACH BIG_LOO IN BIG_LOOP %]
569 [% FOREACH innerloo IN BIG_LOO.innerloop %]
570 [% IF ( innerloo.important ) %]
571 fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"));
573 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
574 [% IF ( subfield_loo.important ) %]subfields.push("[% subfield_loo.id | html %]");
575 tab.push("[% BIG_LOO.number | html %]");
576 label.push("[% subfield_loo.marc_lib | $raw %]");
581 StrAlert += "<h4>" + _("The following important subfields aren’t filled:") + "</h4>";
582 notFilledClass = "important_subfield_not_filled";
585 for(var i=0,len=subfields.length; i<len ; i++){
586 var tag=subfields[i].substr(4,3);
587 var subfield=subfields[i].substr(17,1);
588 var tagnumber=subfields[i].substr(19,subfields[i].lastIndexOf("_")-19);
589 if (tabflag[tag+subfield+tagnumber] == null) {
590 tabflag[tag+subfield+tagnumber]=new Array();
591 tabflag[tag+subfield+tagnumber][0]=0;
593 if( tabflag[tag+subfield+tagnumber][0] != 1 && (document.getElementById(subfields[i]) != null && ! document.getElementById(subfields[i]).value || document.getElementById(subfields[i]) == null)){
594 tabflag[tag+subfield+tagnumber][0] = 0 + tabflag[tag+subfield+tagnumber] ;
596 var elt = document.getElementById(subfields[i]);
597 if ( elt.nodeName == 'SELECT' ) {
598 $(elt).siblings('.select2').find("span[role='combobox']").addClass(notFilledClass);
600 elt.setAttribute('class','input_marceditor noEnterSubmit ' + notFilledClass);
602 $('#' + subfields[i]).focus();
603 tabflag[tag+subfield+tagnumber][1]=label[i];
604 tabflag[tag+subfield+tagnumber][2]=tab[i];
606 tabflag[tag+subfield+tagnumber][0] = 1;
608 tabflag[tag+subfield+tagnumber][3] = subfields[i];
611 for (var tagsubfieldid in tabflag){
612 if (tabflag[tagsubfieldid][0]==0){
613 var tag=tagsubfieldid.substr(0,3);
614 var subfield=tagsubfieldid.substr(3,1);
615 StrAlert += "<li>"+_("Tag %s subfield %s %s in tab %s").format(tag, subfield, formatFieldName( tabflag[tagsubfieldid][1] ), tabflag[tagsubfieldid][2]) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + tabflag[tagsubfieldid][2] + '" data-field="' + tabflag[tagsubfieldid][3] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>';
620 /* Check for mandatories/importants field(not subfields) */
621 /* Loop over array of fields identified as mandatory or
622 important to see if at least one subfield is filled */
623 mandatoryFields = new Object();
625 for(var i=0,len=fields.length; i<len; i++){
628 divid = "tag_" + arr[0] + "_" + arr[1];
629 varegexp = new RegExp("^tag_" + arr[0] + "_code_");
631 if(parseInt(arr[0]) >= 10){
632 elem = document.getElementById(divid);
633 eleminputs = elem.getElementsByTagName('input');
635 for(var j=0,len2=eleminputs.length; j<len2; j++){
637 if(eleminputs[j].name.match(varegexp) && eleminputs[j].value){
638 inputregexp = new RegExp("^tag_" + arr[0] + "_subfield_" + eleminputs[j].value + "_" + arr[2]);
640 for( var k=0; k<len2; k++){
641 if( eleminputs[k].id.match(inputregexp) ){
642 if( eleminputs[k].value ){
648 elemselect = elem.getElementsByTagName('select');
649 for( var k=0; k<elemselect.length; k++){
650 if(elemselect[k].id.match(inputregexp) && elemselect[k].value){
657 elemtextareas = elem.getElementsByTagName('textarea');
658 for(var j=0,len2=elemtextareas.length; j<len2; j++){
659 // this bit assumes that the only textareas in this context would be for subfields
660 if (elemtextareas[j].value) {
672 mandatoryFields[ arr[0] ] = {
673 importance: "mandatory",
674 elemid: "div_indicator_" + divid,
678 mandatoryFields[ arr[0] ] = {
679 importance: "important",
680 elemid: "div_indicator_" + divid,
688 if( Object.entries(mandatoryFields).length > 0 ){
689 StrAlert += "<h4>" + _("The following fields aren't filled:") + "</h4>";
691 for( var prop in mandatoryFields ){
692 if( mandatoryFields[prop]["importance"] == "mandatory" ){
693 StrAlert += "<li>" + _("Field %s is mandatory, at least one of its subfields must be filled.").format( prop ) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + mandatoryFields[prop]["tab"] + '" data-field="' + mandatoryFields[prop]["elemid"] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>';
695 StrAlert += "<li>" + _("Field %s is important, at least one of its subfields must be filled.").format(prop) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + mandatoryFields[prop]["tab"] + '" data-field="' + mandatoryFields[prop]["elemid"] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>';
700 StrAlert += "</div>";
702 $("#show-errors").html('<button type="button" class="btn btn-danger show-errors"><i class="fa fa-warning"></i> ' + _("Errors") + '</span>');
710 * Run checks for mandatory and important fields
711 * Output errors if necessary, or submit the form
714 var StrAlert = AreFieldsNotOk();
715 var StrWarning = AreFieldsNotOk( false );
716 if( !StrAlert && StrWarning ){
717 // Check important fields
718 $("#check_errors").html( StrWarning );
719 $('html, body').animate({ scrollTop: 0 }, 'fast');
721 var r=confirm( _("Important fields(s) are not filled. Are you sure you want to save?" ) );
728 } else if( StrAlert ){
729 var strAll = StrAlert;
731 strAll += StrWarning;
733 $("#check_errors").html( strAll );
734 $('html, body').animate({ scrollTop: 0 }, 'fast');
735 Sticky.hcSticky('refresh');
737 } else if( !StrAlert && !StrWarning ){
744 * check if z3950 mandatories are set or not
746 function GetZ3950Terms(){
747 var frameworkcode = document.getElementById("frameworkcode").value;
748 var strQuery = "&frameworkcode=" + encodeURIComponent(frameworkcode);
749 var mandatories = new Array();
750 var mandatories_label = new Array();
751 [% FOREACH BIG_LOO IN BIG_LOOP %]
752 [% FOREACH innerloo IN BIG_LOO.innerloop %]
753 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
754 [% IF ( subfield_loo.z3950_mandatory ) %]
755 mandatories.push("[% subfield_loo.id | html %]");
756 mandatories_label.push("[% subfield_loo.z3950_mandatory | html %]");
762 for(var i=0,len=mandatories.length; i<len ; i++){
763 var field_value = document.getElementById(mandatories[i]).value;
765 strQuery += "&"+encodeURIComponent(mandatories_label[i])+"="+encodeURIComponent(field_value);
771 function Changefwk() {
773 f.op.value = "[% op | html %]";
774 f.biblionumber.value = "[% biblionumberdata | html %]";
775 f.changed_framework.value = "changed";
779 /* Wrap a value in HTML without putting HTML in translatable string */
780 function formatFieldName( string ){
781 return "<strong><em>" + string + "</em></strong>";
784 [% Asset.css("css/addbiblio.css") | $raw %]
786 <body id="cat_addbiblio" class="cat">
789 <div>Loading, please wait...</div>
792 [% WRAPPER 'header.inc' %]
793 [% INCLUDE 'cataloging-search.inc' %]
795 [% WRAPPER 'sub-header.inc' %]
796 [% WRAPPER breadcrumbs %]
797 [% WRAPPER breadcrumb_item %]
798 <a href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cataloging</a>
800 [% WRAPPER breadcrumb_item bc_active= 1 %]
801 [% IF ( biblionumber ) %]
802 <span>[% tp('Editing MARC record titled:', "Editing") | html %] [% title | html %] (Record number [% biblionumber | html %])</span>
804 [% IF ( circborrowernumber ) %]
805 <span>Add MARC record (fast cataloging)</span>
807 <span>Add MARC record</span>
811 [% END #/ WRAPPER breadcrumbs %]
812 [% END #/ WRAPPER sub-header.inc %]
814 <div class="main container-fluid">
816 <div class="col-md-10 col-md-offset-1">
818 <div id="check_errors"></div>
821 [% IF ( biblionumber ) %]
822 Editing [% title | $HtmlTags tag="em" %] (Record number [% biblionumber | html %])
824 [% IF (circborrowernumber) %]
825 <span>Add MARC record (fast cataloging)</span>
827 <span>Add MARC record</span>
832 [% UNLESS ( number ) %]
833 <!-- show duplicate warning on tab 0 only -->
834 [% IF ( duplicatebiblionumber ) %]
835 <div class="dialog alert">
836 <h3>Duplicate record suspected</h3>
837 <p>Is this a duplicate of <a href="/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=[% duplicatebiblionumber | uri %]" onclick="openWindow('/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=[% duplicatebiblionumber | uri %]&popup=1', 'DuplicateBiblio','800','600'); return false;">[% duplicatetitle | html %] <i class="fa fa-window-restore"></i></a> ?</p>
838 [% IF ( CAN_user_editcatalogue_edit_items ) %]
839 <form action="/cgi-bin/koha/cataloguing/additem.pl" method="get">
840 <input type="hidden" name="biblionumber" value="[% duplicatebiblionumber | html %]" />
841 <button type="submit" class="new"><i class="fa fa-fw fa-pencil"></i> Yes, edit existing items</button>
844 <form action="/cgi-bin/koha/catalogue/detail.pl" method="get">
845 <input type="hidden" name="biblionumber" value="[% duplicatebiblionumber | html %]" />
846 <input type="submit" value="Yes: View existing items" />
849 <form action="/cgi-bin/koha/cataloguing/addbiblio.pl" method="get">
850 [% IF ( CAN_user_editcatalogue_edit_items ) %]
851 <button type="submit" class="new" onclick="confirmnotdup('items'); return false;"><i class="fa fa-fw fa-save"></i> No, save as new record</button>
853 <button type="submit" class="new" onclick="confirmnotdup('view'); return false;"><i class="fa fa-fw fa-save"></i> No, save as new record</button>
856 </div> <!-- /.dialog.alert -->
857 [% END # /IF duplicatebiblionumber %]
858 [% END # /UNLESS number %]
862 opener.document.forms['f'].biblionumber.value=[% biblionumber | html %];
863 opener.document.forms['f'].title.value='[% title | html %]';
867 <form method="post" name="f" id="f" action="/cgi-bin/koha/cataloguing/addbiblio.pl" onsubmit="return Check();">
868 <input type="hidden" value="[% IF ( biblionumber ) %]view[% ELSE %]items[% END %]" id="redirect" name="redirect" />
869 <input type="hidden" value="" id="current_tab" name="current_tab" />
870 <input type="hidden" value="0" id="confirm_not_duplicate" name="confirm_not_duplicate" />
873 <div id="toolbar" class="btn-toolbar">
874 [% IF CAN_user_editcatalogue_edit_items or ( frameworkcode == 'FA' and CAN_user_editcatalogue_fast_cataloging ) %]
875 [% IF (circborrowernumber) %][%# fast cataloging must lead to items %]
876 <!-- Action is under fast cataloging - Save button redirecting to items -->
877 <div class="btn-group"><a href="#" id="saveanditems" class="btn btn-primary"><i class="fa fa-save"></i> Save</a></div>
879 <!-- Not using fast cataloging - Display split menu -->
880 <div class="btn-group">
881 <button class="btn btn-primary" id="saverecord"><i class="fa fa-save"></i> Save</button>
882 <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
883 <span class="caret"></span>
885 <ul class="dropdown-menu">
886 <li><a id="saveandview" href="#">Save and view record</a></li>
887 <li><a id="saveanditems" href="#">Save and edit items</a></li>
888 <li><a id="saveandcontinue" href="#">Save and continue editing</a></li>
893 <!-- User cannot edit items - single button redirecting to view -->
894 <div class="btn-group"><a href="#" id="saveandview" class="btn btn-default"><i class="fa fa-save"></i> Save</a></div>
895 [% END # /IF CAN_user_editcatalogue_edit_items %]
897 [% UNLESS (circborrowernumber) %][%# Hide in fast cataloging %]
898 [% IF biblionumber %]
899 <div class="btn-group"><a class="btn btn-default" href="#" id="z3950search"><i class="fa fa-search"></i> Replace record via Z39.50/SRU search</a></div>
901 <div class="btn-group"><a class="btn btn-default" href="#" id="z3950search"><i class="fa fa-search"></i> Z39.50/SRU search</a></div>
903 [% IF ( CAN_user_editauthorities ) %]
904 <div class="btn-group"><a class="btn btn-default" href="#" id="linkerbutton"><i class="fa fa-refresh"></i> Link authorities automatically</a></div>
908 <div class="btn-group">
909 <button class="btn btn-default dropdown-toggle" data-toggle="dropdown"><i class="fa fa-cog"></i> Settings <span class="caret"></span></button>
910 <ul id="settings-menu" class="dropdown-menu">
911 [% IF Koha.Preference( 'EnableAdvancedCatalogingEditor' ) == 1 && CAN_user_editcatalogue_advanced_editor %]
912 <li><a href="#" id="switcheditor">Switch to advanced editor</a></li>
914 [% UNLESS advancedMARCEditor %]
916 <a href="#" id="marcDocsSelect"><i class="fa fa-check-square-o"></i> Show MARC tag documentation links</a>
918 <a href="#" id="marcTagsSelect"><i class="fa fa-check-square-o"></i> Show tags</a>
921 <li class="dropdown-header">Change framework</li>
923 <a href="#" class="change-framework" data-frameworkcode="">
924 [% IF ( frameworkcode ) %]
925 <i class="fa fa-fw"> </i>
927 <i class="fa fa-fw fa-check"></i>
932 [% FOREACH framework IN frameworks%]
934 <a href="#" class="change-framework" data-frameworkcode="[% framework.frameworkcode | html %]">
935 [% IF framework.frameworkcode == frameworkcode %]
936 <i class="fa fa-fw fa-check"></i>
938 <i class="fa fa-fw"> </i>
940 [% framework.frameworktext | html %]
944 </ul> <!-- /#settings-menu -->
945 </div> <!-- /.btn-group -->
946 [% UNLESS (circborrowernumber) %][%# Hide in fast cataloging %]
947 [% IF (biblionumber) %]
948 <div class="btn-group">
949 <a href="[% PROCESS biblio_a_href biblionumber => biblionumber %]" class="btn btn-link" id="cancel">Cancel</a>
952 <div class="btn-group">
953 <a class="btn btn-link" id="cancel" href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cancel</a>
956 <div id="show-errors" class="btn-group"></div>
957 [% END # /UNLESS circborrowernumber %]
958 <div class="toolbar-tabs-container">
959 [% IF ( BIG_LOOP && BIG_LOOP.size > 1 ) %]
960 [% WRAPPER tabs_nav %]
961 [%- FOREACH BIG_LOO IN BIG_LOOP -%]
963 [% SET bt_active = 1 %]
965 [% SET bt_active = 0 %]
967 [% WRAPPER tab_item tabname= "tab${BIG_LOO.number}XX" bt_active= bt_active %]
968 <span>[% BIG_LOO.number | html %]</span>
971 [% END # /WRAPPER tabs_nav %]
973 <ul class="tag_anchors_list">
974 [% FOREACH BIG_LOO IN BIG_LOOP %]
975 [% IF loop.first %][% SET tab_selected = "tab_selected" %][% ELSE %][% SET tab_selected = "" %][% END %]
976 [% FOREACH innerloo IN BIG_LOO.innerloop %]
977 [% IF ( innerloo.tag ) %]
978 <li class="tag_anchors tag_anchors_[% BIG_LOO.number | html %] [% tab_selected | html %]">
979 <a class="tag_anchor" id="tag_anchor_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]" title="tag_anchor_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]" href="#div_indicator_tag_[% innerloo.tag | uri %]_[% innerloo.index | uri %][% innerloo.random | uri %]">[% innerloo.tag | uri %]</a>
986 </div> <!-- /#toolbar.btn-toolbar -->
988 [% IF bib_doesnt_exist %]
989 <div class="dialog alert">
990 The record you are trying to edit doesn't exist.<br>
991 <a href="/cgi-bin/koha/cataloguing/addbiblio.pl?frameworkcode=">Add a new record</a> or <a href="/cgi-bin/koha/catalogue/search.pl">do a catalog search</a>.
996 <input type="hidden" name="mode" value="popup" />
998 <input type="hidden" name="op" value="addbiblio" />
999 <input type="hidden" id="frameworkcode" name="frameworkcode" value="[% frameworkcode | html %]" />
1000 <input type="hidden" name="z3950" value="[% z3950 | html %]" />
1001 <input type="hidden" name="biblionumber" value="[% biblionumber | html %]" />
1002 <input type="hidden" name="breedingid" value="[% breedingid | html %]" />
1003 <input type="hidden" name="changed_framework" value="" />
1005 [% WRAPPER tabs id= "addbibliotabs" %]
1006 [% WRAPPER tab_panels %]
1007 [% FOREACH BIG_LOO IN BIG_LOOP %]
1009 [% SET bt_active = 1 %]
1011 [% SET bt_active = 0 %]
1013 [% WRAPPER tab_panel tabname="tab${BIG_LOO.number}XX" bt_active= bt_active %]
1015 [% IF ( BIG_LOOP.size > 1 ) %]
1016 <h3>Section [% BIG_LOO.number | html %]</h3>
1019 [% FOREACH innerloo IN BIG_LOO.innerloop %]
1020 [% IF ( innerloo.tag ) %]
1021 [% IF innerloo.tag != previous %]
1022 [% IF previous != "" %]
1025 [% previous = innerloo.tag %]
1026 [% IF ( innerloo.repeatable ) %]
1027 <ul class="sortable_field">
1032 [% IF ( innerloo.repeatable ) %]
1033 <li class="tag sortable_tag clearfix" id="tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]">
1035 <li class="tag clearfix" id="tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]">
1037 <div class="tag_title" id="div_indicator_tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]">
1038 [% IF advancedMARCEditor %]
1039 <a href="#" tabindex="1" class="tagnum" title="[% innerloo.tag_lib | html %] - Click to expand this tag" onclick="ExpandField('tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]'); return false;">[% innerloo.tag | html %]</a>
1041 <span class="tagnum" title="[% innerloo.tag_lib | html %]">[% innerloo.tag | html %]</span>
1042 <a href="#" class="marcdocs" onclick="PopupMARCFieldDoc('[% innerloo.tag | html %]'); return false;"> ?</a>
1045 [% IF ( innerloo.fixedfield ) %]
1048 class="indicator flat"
1049 style="display:none;"
1050 name="tag_[% innerloo.tag | html %]_indicator1_[% innerloo.index | html %][% innerloo.random | html %]"
1053 value="[% innerloo.indicator1 | html %]" />
1056 class="indicator flat"
1057 style="display:none;"
1058 name="tag_[% innerloo.tag | html %]_indicator2_[% innerloo.index | html %][% innerloo.random | html %]"
1061 value="[% innerloo.indicator2 | html %]" />
1065 class="indicator flat"
1066 name="tag_[% innerloo.tag | html %]_indicator1_[% innerloo.index | html %][% innerloo.random | html %]"
1069 value="[% innerloo.indicator1 | html %]" />
1072 class="indicator flat"
1073 name="tag_[% innerloo.tag | html %]_indicator2_[% innerloo.index | html %][% innerloo.random | html %]"
1076 value="[% innerloo.indicator2 | html %]" />
1077 [% END # /IF innerloo.fixedfield %] -
1079 [% UNLESS advancedMARCEditor %]
1080 <a href="#" tabindex="1" class="expandfield" onclick="ExpandField('tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]'); return false;" title="Click to expand this tag">[% innerloo.tag_lib | html %]</a>
1083 <span class="field_controls">
1084 [% IF ( innerloo.repeatable ) %]
1085 <a href="#" tabindex="1" class="buttonPlus" onclick="CloneField('tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]','0','[% advancedMARCEditor | html %]'); return false;" title="Repeat this tag">
1086 <img src="[% interface | html %]/[% theme | html %]/img/repeat-tag.png" alt="Repeat this tag" />
1089 <a href="#" tabindex="1" class="buttonMinus" onclick="UnCloneField('tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]'); return false;" title="Delete this tag">
1090 <img src="[% interface | html %]/[% theme | html %]/img/delete-tag.png" alt="Delete this tag" />
1092 </span> <!-- /.field_controls -->
1093 </div> <!-- /div.tag_title -->
1095 <ul class="sortable_subfield">
1096 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
1097 <!-- One line on the marc editor -->
1098 <li class="subfield_line" style="[% subfield_loo.visibility | html %]" id="subfield[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]">
1099 <div class="subfieldcode">
1101 title="[% subfield_loo.marc_lib | $raw %]"
1102 style=" [% IF ( subfield_loo.fixedfield ) %]display:none; [% END %]border:0;"
1103 name="tag_[% subfield_loo.tag | html %]_code_[% subfield_loo.subfield | html %]_[% subfield_loo.index | html %]_[% subfield_loo.index_subfield | html %]"
1104 value="[% subfield_loo.subfield | html %]"
1110 [% UNLESS advancedMARCEditor %]
1111 [% IF ( subfield_loo.mandatory ) %]
1112 <div class="subfield subfield_mandatory">
1113 [% ELSIF ( subfield_loo.important ) %]
1114 <div class="subfield subfield_important">
1116 <div class="subfield">
1118 [% IF ( subfield_loo.fixedfield ) %]
1119 <label for="tag_[% subfield_loo.tag | html %]_subfield_[% subfield_loo.subfield | html %]_[% subfield_loo.index | html %]_[% subfield_loo.index_subfield | html %]" style="display:none;" class="labelsubfield">
1121 <label for="tag_[% subfield_loo.tag | html %]_subfield_[% subfield_loo.subfield | html %]_[% subfield_loo.index | html %]_[% subfield_loo.index_subfield | html %]" class="labelsubfield">
1123 [% subfield_loo.marc_lib | $raw %]
1128 [% SET mv = subfield_loo.marc_value %]
1129 <div id="field_marceditor[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]" class="field_marceditor">
1130 [% IF ( mv.type == 'text' ) %]
1131 [% IF ( mv.readonly == 1 ) %]
1132 <input type="text" id="[%- mv.id | html -%]" name="[%- mv.name | html -%]" value="[%- mv.value | html -%]" class="input_marceditor readonly" tabindex="1" size="[%- mv.size | html -%]" maxlength="[%- mv.maxlength | html -%]" readonly="readonly" />
1134 <input type="text" id="[%- mv.id | html -%]" name="[%- mv.name | html -%]" value="[%- mv.value | html -%]" class="input_marceditor" tabindex="1" size="[%- mv.size | html -%]" maxlength="[%- mv.maxlength | html -%]" />
1137 [% ELSIF ( mv.type == 'text_complex' ) %]
1138 <input type="text" id="[%- mv.id | html -%]" name="[%- mv.name | html -%]" value="[%- mv.value | html -%]" class="input_marceditor framework_plugin" tabindex="1" size="[%- mv.size | html -%]" maxlength="[%- mv.maxlength | html -%]" />
1139 [% mv.javascript | $raw %]
1140 [% ELSIF ( mv.type == 'hidden' ) %]
1141 <input tabindex="1" type="hidden" id="[%- mv.id | html -%]" name="[%- mv.name | html -%]" size="[%- mv.size | html -%]" maxlength="[%- mv.maxlength | html -%]" value="[%- mv.value | html -%]" />
1142 [% ELSIF ( mv.type == 'textarea' ) %]
1143 <textarea cols="70" rows="4" id="[%- mv.id | html -%]" name="[%- mv.name | html -%]" class="input_marceditor" tabindex="1">[%- mv.value | html -%]</textarea>
1144 [% ELSIF ( mv.type == 'select' ) %]
1145 [% IF mv.category AND CAN_user_parameters_manage_auth_values %]
1146 <select name="[%- mv.name | html -%]" tabindex="1" class="input_marceditor" id="[%- mv.id | html -%]" data-category="[% mv.category | html %]">
1148 <select name="[%- mv.name | html -%]" tabindex="1" class="input_marceditor select2" id="[%- mv.id | html -%]">
1150 [% SET matched = 0 %]
1151 [% FOREACH aval IN mv.values %]
1152 [% IF aval == mv.default %]
1153 [% SET matched = 1 %]
1154 <option value="[%- aval | html -%]" selected="selected">[%- mv.labels.$aval | html -%]</option>
1156 <option value="[%- aval | html -%]">[%- mv.labels.$aval | html -%]</option>
1160 [% UNLESS matched # If the current value is not in the authorised value list %]
1161 <option value="[%- mv.default | html -%]" selected="selected">[%- mv.default | html -%] (Not an authorised value)</option>
1163 <span style="float:right;" title="The current value [% mv.default | html %] is not configured for the authorised value category controlling this subfield"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></span>
1167 [% UNLESS matched # If the current value is not in the authorised list %]
1169 [% END # /IF (mv.type...) %]
1171 [% IF ( subfield_loo.mandatory ) %]
1172 <div class="subfield_loop_mandatory">
1173 <span class="required">Required</span>
1175 [% ELSIF ( subfield_loo.important ) %]
1176 <div class="subfield_loop_mandatory">
1177 <span class="important">Important</span>
1180 <div class="subfield_controls">
1181 [% IF ( mv.type == 'text' ) %]
1182 [% IF ( mv.authtype ) %]
1183 <a href="#" class="buttonDot tag_editor" onclick="openAuth(this.parentNode.parentNode.getElementsByTagName('input')[1].id,'[%- mv.authtype | html -%]','biblio'); return false;" tabindex="1" title="Tag editor">Tag editor</a>
1185 [% ELSIF ( mv.type == 'text_complex' ) %]
1187 <span class="buttonDot tag_editor disabled" tabindex="-1" title="Field autofilled by plugin"></span>
1189 [% IF mv.plugin == "upload.pl" %]
1190 <a href="#" id="buttonDot_[% mv.id | html %]" class="tag_editor upload framework_plugin" tabindex="1"><i class="fa fa-upload" aria-hidden="true"></i> Upload</a>
1192 <a href="#" id="buttonDot_[% mv.id | html %]" class="buttonDot tag_editor framework_plugin" tabindex="1" title="Tag editor">Tag editor</a>
1197 [% IF ( subfield_loo.repeatable ) %]
1198 <a href="#" class="buttonPlus" tabindex="1" onclick="CloneSubfield('subfield[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]','[% advancedMARCEditor | html %]'); return false;">
1199 <img src="[% interface | html %]/[% theme | html %]/img/clone-subfield.png" alt="Clone" title="Clone this subfield" />
1201 <a href="#" class="buttonMinus" tabindex="1" onclick="UnCloneField('subfield[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]'); return false;">
1202 <img src="[% interface | html %]/[% theme | html %]/img/delete-subfield.png" alt="Delete" title="Delete this subfield" />
1206 </li> <!-- /.subfield_line -->
1207 <!-- End of the line -->
1208 [% END # /FOREACH subfield_loop %]
1209 </ul> <!-- /.sortable_subfield -->
1210 </li> <!-- /.tag.clearfix -->
1211 [% END %]<!-- if innerloo.tag -->
1212 [% END # /FOREACH BIG_LOO.innerloop %]
1213 </ul> <!-- /.sortable_field -->
1214 [% END # /tab_panel#tabXXX %]
1215 [% END # /FOREACH BIG_LOOP %]
1216 [% END # /WRAPPER tab_panels %]
1217 [% END # /WRAPPER tabs %]
1219 [%# Fields for fast cataloging %]
1220 <input type="hidden" name="barcode" value="[% barcode | html %]" />
1221 <input type="hidden" name="branch" value="[% branch | html %]" />
1222 <input type="hidden" name="circborrowernumber" value="[% circborrowernumber | html %]" />
1223 <input type="hidden" name="stickyduedate" value="[% stickyduedate | html %]" />
1224 <input type="hidden" name="duedatespec" value="[% duedatespec | html %]" />
1225 [%# End of fields for fast cataloging %]
1226 </form> <!-- /name=f -->
1228 [% INCLUDE 'modals/cataloguing_create_av.inc' %]
1230 </div> <!-- /.col-md-10.col-md-offset-1 -->
1231 </div> <!-- /.row -->
1233 [% INCLUDE 'intranet-bottom.inc' %]