4 [% INCLUDE 'doc-head-open.inc' %]
5 <title>[% IF ( biblionumber ) %]Editing [% title | html %] (Record number [% biblionumber | html %])[% ELSE %]Add MARC record[% END %] › Cataloging › Koha</title>
6 [% INCLUDE 'doc-head-close.inc' %]
7 [% INCLUDE 'calendar.inc' %]
8 [% Asset.js("lib/hc-sticky.js") | $raw %]
9 [% INCLUDE 'select2.inc' %]
11 [% IF Koha.Preference('CreateAVFromCataloguing') && CAN_user_parameters_manage_auth_values %]
12 var auth_values_creation = 1;
14 var auth_values_creation = 0;
16 $.fn.select2.defaults.set("width", "100%" );
18 [% Asset.js("js/cataloging.js") | $raw %]
19 [% Asset.js("js/browser.js") | $raw %]
21 var browser = KOHA.browser('[% searchid | html %]', parseInt('[% biblionumber | html %]', 10));
24 $(window).load(function(){
28 $(document).ready(function() {
30 [% IF bib_doesnt_exist %]
31 $("#addbibliotabs").hide();
35 $("a[data-toggle='tab']").on("shown.bs.tab", function (e) {
36 $( e.target.hash + " .input_marceditor:visible:eq(0)").focus();
39 /* On page load, check for location.hash in the page URL */
40 /* If present the location hash will be used to activate the correct tab */
41 var hash = location.hash;
42 var hashPieces = hash.split('?');
43 if( hashPieces[0] !== "" ){
44 selectTab( hashPieces[0] );
45 window.scrollTo( 0, 0 );
48 $( "ul.sortable_field", "#addbibliotabs" ).sortable({
50 containment: $("#addbibliotabs")
52 $( "ul.sortable_subfield", "#addbibliotabs" ).sortable({
58 hash = "#[% tab | html %]";
62 Sticky = $("#toolbar");
65 stickyClass: "floating"
68 /* check cookie to hide/show marcdocs*/
69 if( Cookies.get("marcdocs_[% borrowernumber | html %]") == 'hide'){
70 toggleMARCdocLinks(false);
72 toggleMARCdocLinks(true);
75 $("#marcDocsSelect").click(function(){
76 if( Cookies.get("marcdocs_[% borrowernumber | html %]") == 'hide'){
77 toggleMARCdocLinks(true);
79 toggleMARCdocLinks(false);
83 /* check cookie to hide/show marc tags*/
84 var marctags_cookie = Cookies.get("marctags_[% borrowernumber | html %]");
85 if( marctags_cookie == 'hide'){
86 toggleMARCTagLinks(false);
87 } else if( marctags_cookie == 'show'){
88 toggleMARCTagLinks(true)
90 [% UNLESS Koha.Preference("hide_marc") %]
91 toggleMARCTagLinks(true)
93 toggleMARCTagLinks(false);
97 $("#marcTagsSelect").click(function(){
98 if( Cookies.get("marctags_[% borrowernumber | html %]") == 'hide'){
99 toggleMARCTagLinks(true)
101 toggleMARCTagLinks(false);
105 $("#z3950search").click(function(){
109 $("#linkerbutton").click(function(){
113 $("#saverecord").click(function(){
114 $(".btn-group").removeClass("open");
119 $("#saveandview").click(function(){
120 $(".btn-group").removeClass("open");
125 $("#saveanditems").click(function(){
126 $(".btn-group").removeClass("open");
130 $("#saveandcontinue").click(function(){
131 $(".btn-group").removeClass("open");
132 var tab = $("#addbibliotabs div.active:first").attr('id');
133 $("#current_tab").val(tab);
134 redirect("just_save", tab);
138 $( '#switcheditor' ).click( function() {
139 var breedingid = [% breedingid || "null" | html %];
141 if ( !confirm( breedingid ? _("This record cannot be transferred to the advanced editor. Continue?") : _("Any changes will not be saved. Continue?") ) ) return false;
143 Cookies.set( 'catalogue_editor_[% logged_in_user.borrowernumber | html %]', 'advanced', { expires: 365, path: '/', sameSite: 'Lax' } );
145 var biblionumber = [% biblionumber || "null" | html %];
147 if ( biblionumber ) {
148 window.location = '/cgi-bin/koha/cataloguing/editor.pl#catalog/' + biblionumber;
150 window.location = '/cgi-bin/koha/cataloguing/editor.pl';
155 $(".change-framework").on("click", function(){
156 var frameworkcode = $(this).data("frameworkcode");
157 $("#frameworkcode").val( frameworkcode );
161 $(".toolbar-tabs a").on("click",function(e){
163 selectTab( this.hash );
166 $(".tag_anchor").on("click", function(e){
168 $(".tag_anchor").removeClass("selected");
169 $(this).addClass("selected");
170 var link = this.href;
171 var linkid = link.substring( link.indexOf("#") + 1 );
172 window.scrollTo( 0, getScrollto( linkid, "toolbar" ) );
175 $("body").on("click", ".linkfield", function(e){
177 var tab = $(this).data("tab");
178 var field = $(this).data("field");
179 var tablink = $("a[data-tabid='" + tab + "']" ).get(0).hash;
180 selectTab( tablink );
181 window.scrollTo( 0, getScrollto( field, "toolbar" ) );
184 $("body").on("click", ".show-errors", function(e){
185 document.getElementById("form-errors").scrollIntoView();
190 function selectTab( tablink ){
191 let a = $("a[href='" + tablink + "']");
192 $(".toolbar-tabs li").removeClass("selected");
193 a.tab("show").parent().addClass("selected");
194 var tabid = a.data("tabid");
195 $(".tag_anchors").removeClass("tab_selected").hide();
196 $(".tag_anchors_" + tabid ).addClass("tab_selected").show();
200 * Returns a roughly ideal position to scroll an element into view
201 * @param {string} target - The HTML id of the element to scroll into view
202 * @param {string} elemid - The HTML id of the element which might obscure
203 * the view of the target element e.g. a floating toolbar
204 * @return {number} - The y-coordinate to pass to window.scrollTo()
206 function getScrollto( target, elemid ){
207 var dest = $("#" + target );
208 var yoffset = dest.offset();
211 var element = $("#" + elemid );
212 var elem_height = element.outerHeight();
216 return yoffset.top - elem_height - 20;
219 function redirect(dest){
220 $("#redirect").attr("value",dest);
224 [% IF ( CAN_user_editcatalogue_edit_items ) %]
225 var onOption = function () {
231 * this function append button for create new authority if not found
234 function addCreateAuthorityButton(tag_subfield_line, heading, tag_index) {
235 var title = _("Create authority");
236 var elem = $('<a href="#" title="' + title + '"><i class="fa fa-plus-circle"></i></a>');
237 tag_subfield_line.append(elem);
238 var tag_subfield_line_a = $('.subfield_line[id^=subfield' + heading.tag + 'a]').eq(tag_index);
239 var subfield_a = tag_subfield_line_a.find('.input_marceditor').eq(0);
240 var index = subfield_a.attr('id');
241 elem.click(function() {
242 var popup = window.open("", "new_auth_popup",'fullscreen,toolbar=false,scrollbars=yes');
244 // Create a new form that will be POSTed in the new window
245 var form = $('<form>').attr({
247 action: "/cgi-bin/koha/authorities/authorities.pl",
248 target: "new_auth_popup"
250 //add the authtypecode
251 form.append($('<input>').attr({
253 name: 'authtypecode',
254 value: heading.auth_type
256 form.append($('<input>').attr({
259 value: heading.tag_to_report
261 form.append($('<input>').attr({
266 form.append($('<input>').attr({
271 $('.tag[id^=tag_' + heading.tag + '_]').eq(tag_index).find(':input').each(function(){
272 form.append($('<input>').attr({
274 name: this.name.split('_',4).join(''),
278 $('body').append(form);
288 * Updates the authid for every heading field
289 * Adds visual feedback for the changes made on the form.
291 function updateHeadingLinks(links) {
292 var current_tag = '';
295 // Delete the old message dialog and create a new one
296 $('#autolinker_dialog').remove();
297 var message_dialog = $('<div id="autolinker_dialog" class="dialog message"><strong>' + _("Automatic authority link results:") + '</strong><ul></ul></div>');
298 var message_dialog_ul = message_dialog.find('ul');
300 $.each(links, function(index, heading) {
301 if(current_tag == heading.tag) {
305 current_tag = heading.tag;
309 // Find the $9 field to update
310 var tag_subfield_line = $('.subfield_line[id^=subfield' + heading.tag + '9]').eq(tag_index);
311 if( tag_subfield_line.length < 1 ){ return; }
313 var subfield = tag_subfield_line.find('.input_marceditor').eq(0);
314 subfield.removeClass("matching_authority_field no_matching_authority_field");
316 // Delete the old status if one exists
317 tag_subfield_line.children('.subfield_status').remove();
319 // If the field wasn't modified. Skip it.
320 if(heading.status == 'UNCHANGED') {
325 // Make the subfield line visible and update its value
326 tag_subfield_line.show();
327 subfield.val(heading.authid);
329 // Add the new status
330 var image = '<i class="fa fa-close subfield_status no_matching_authority" </i> ';
332 var field_class = 'no_matching_authority_field';
333 switch(heading.status) {
335 image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
336 message = _("A matching authority was found in the local database.");
337 field_class = 'matching_authority_field';
340 image = '<i class="fa fa-check subfield_status matching_authority"></i> ';
341 message = _("No matching authority found. A new authority was created automatically.");
342 field_class = 'matching_authority_field';
344 case 'MULTIPLE_MATCH':
345 message = _("More than one local match found. Possibly a duplicate authority!");
348 message = _("No matching authority found.");
351 message = heading.status;
355 subfield[0].classList.add(field_class);
356 tag_subfield_line.find('i').each(function() {
359 tag_subfield_line.append(image);
361 // Add the message to the dialog
362 message_dialog_ul.append('<li><strong>' + heading.tag + '</strong> - ' + message + '</li>');
364 // Add a link to create a new authority if none was found
365 if(heading.status == 'NONE_FOUND' && tag_subfield_line.find('i').length == 1) {
366 addCreateAuthorityButton(tag_subfield_line, heading , tag_index);
370 if(message_dialog.find('li').length == 0) {
371 message_dialog_ul.append("<li>" + _("No authority link was changed.") + "</li>");
373 $('#addbibliotabs').before(message_dialog);
377 * Use an ajax request to automatically find authority links for the current record
379 function AutomaticLinker() {
380 // Show the Loading overlay
381 $("#loading").show();
383 // Remove fields that are completely empty
384 $('#f').find('.tag').each(function() {
386 $(this).find('.input_marceditor').each(function() {
387 if($(this).val() != '') {
393 UnCloneField($(this).attr('id'));
397 // Get all the form values to post via AJAX
399 $('#f').find(':input').each(function(){
400 form_data[this.name] = $(this).val();
402 delete form_data[''];
404 // Send the data to automatic_linker.pl
406 url:'/cgi-bin/koha/svc/cataloguing/automatic_linker.pl',
410 error: function(xhr) {
411 alert("Error : \n" + xhr.responseText);
413 success: function(json) {
414 switch(json.status) {
416 alert(_("Error : You do not have the permissions necessary to use this functionality."));
419 updateHeadingLinks(json.links);
423 complete: function() {
424 $("#loading").hide();
430 function PopupMARCFieldDoc(field) {
431 [% IF Koha.Preference('marcfielddocurl') %]
432 var docurl = "[% Koha.Preference('marcfielddocurl').replace('"','"') | html %]";
433 docurl = docurl.replace("{MARC}", "[% marcflavour | html %]");
434 docurl = docurl.replace("{FIELD}", ""+field);
435 docurl = docurl.replace("{LANG}", "[% lang | html %]");
437 [% ELSIF ( marcflavour == 'MARC21' ) %]
438 _MARC21FieldDoc(field);
439 [% ELSIF ( marcflavour == 'UNIMARC' ) %]
440 _UNIMARCFieldDoc(field);
443 function confirmnotdup(redirect){
444 $("#confirm_not_duplicate").attr("value","1");
445 $("#redirect").attr("value",redirect);
449 function Dopop(link,i) {
450 defaultvalue = document.getElementById(i).value;
451 window.open(link+"&result="+defaultvalue,"valuebuilder",'width=700,height=550,toolbar=false,scrollbars=yes');
455 * this function open a popup to search on z3950 server.
457 function PopupZ3950() {
458 var strQuery = GetZ3950Terms();
460 window.open("/cgi-bin/koha/cataloguing/z3950_search.pl?biblionumber=[% biblionumber | html %]"+strQuery,"z3950search",'width=740,height=450,location=yes,toolbar=no,scrollbars=yes,resize=yes');
464 function PopupMARCFieldDoc(field) {
465 [% IF Koha.Preference('marcfielddocurl') %]
466 var docurl = "[% Koha.Preference('marcfielddocurl').replace('"','"') | html %]";
467 docurl = docurl.replace("{MARC}", "[% marcflavour | html %]");
468 docurl = docurl.replace("{FIELD}", ""+field);
469 docurl = docurl.replace("{LANG}", "[% lang | html %]");
471 [% ELSIF ( marcflavour == 'MARC21' ) %]
472 _MARC21FieldDoc(field);
473 [% ELSIF ( marcflavour == 'UNIMARC' ) %]
474 _UNIMARCFieldDoc(field);
478 function _MARC21FieldDoc(field) {
480 window.open("http://www.loc.gov/marc/bibliographic/bdleader.html");
481 } else if (field >= 90 && field <= 99 ){
482 window.open("http://www.loc.gov/marc/bibliographic/bd09x.html");
483 } else if (field >= 590 && field <= 599 ){
484 window.open("http://www.loc.gov/marc/bibliographic/bd59x.html");
485 } else if (field >= 690 && field <= 699 ){
486 window.open("http://www.loc.gov/marc/bibliographic/bd69x.html");
487 } else if (field < 900) {
488 window.open("http://www.loc.gov/marc/bibliographic/bd" + ("000"+field).slice(-3) + ".html");
490 window.open("http://www.loc.gov/marc/bibliographic/bd9xx.html");
494 function _UNIMARCFieldDoc(field) {
495 /* http://archive.ifla.org/VI/3/p1996-1/ is an outdated version of UNIMARC, but
496 seems to be the only version available that can be linked to per tag. More recent
497 versions of the UNIMARC standard are available on the IFLA website only as
502 url = "http://archive.ifla.org/VI/3/p1996-1/uni.htm";
504 var first = field.substring(0,1);
505 url = "http://archive.ifla.org/VI/3/p1996-1/uni" + first + ".htm#";
506 if (first == 0) url = url + "b";
508 ? "http://archive.ifla.org/VI/3/p1996-1/uni9.htm"
515 * Functions to hide/show marc docs and tags links
518 function toggleMARCdocLinks(flag){
520 $(".marcdocs").show();
521 Cookies.set("marcdocs_[% borrowernumber | html %]",'show', { path: "/", expires: 365, sameSite: 'Lax' });
522 $("#marcDocsSelect i").addClass('fa-check-square-o').removeClass('fa-square-o');
524 $(".marcdocs").hide();
525 Cookies.set("marcdocs_[% borrowernumber | html %]",'hide', { path: "/", expires: 365, sameSite: 'Lax' });
526 $("#marcDocsSelect i").removeClass('fa-check-square-o').addClass('fa-square-o');
530 function toggleMARCTagLinks(flag){
533 $(".subfieldcode").show();
534 Cookies.set("marctags_[% borrowernumber | html %]",'show', { path: "/", expires: 365, sameSite: 'Lax' });
535 $("#marcTagsSelect i").addClass('fa-check-square-o').removeClass('fa-square-o');
538 $(".subfieldcode").hide();
539 Cookies.set("marctags_[% borrowernumber | html %]",'hide', { path: "/", expires: 365, sameSite: 'Lax' });
540 $("#marcTagsSelect i").removeClass('fa-check-square-o').addClass('fa-square-o');
545 * check if mandatory/important subfields are written
546 * @param mandatory true to check for mandatories, false for importants
548 function AreFieldsNotOk (mandatory = true) {
549 var fields = new Array();
550 var subfields = new Array();
551 var tab = new Array();
552 var label = new Array();
554 var tabflag= new Array();
555 var StrAlert = "<div id='form-errors' class='dialog alert list'>";
556 var notFilledClass = "subfield_not_filled";
559 [% FOREACH BIG_LOO IN BIG_LOOP %]
560 [% FOREACH innerloo IN BIG_LOO.innerloop %]
561 [% IF ( innerloo.mandatory ) %]
562 fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"));
564 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
565 [% IF ( subfield_loo.mandatory ) %]subfields.push("[% subfield_loo.id | html %]");
566 tab.push("[% BIG_LOO.number | html %]");
567 label.push("[% subfield_loo.marc_lib | $raw %]");
572 StrAlert += "<h4>" + _("The following mandatory subfields aren't filled:") + "</h4>";
574 [% FOREACH BIG_LOO IN BIG_LOOP %]
575 [% FOREACH innerloo IN BIG_LOO.innerloop %]
576 [% IF ( innerloo.important ) %]
577 fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"));
579 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
580 [% IF ( subfield_loo.important ) %]subfields.push("[% subfield_loo.id | html %]");
581 tab.push("[% BIG_LOO.number | html %]");
582 label.push("[% subfield_loo.marc_lib | $raw %]");
587 StrAlert += "<h4>" + _("The following important subfields aren’t filled:") + "</h4>";
588 notFilledClass = "important_subfield_not_filled";
591 for(var i=0,len=subfields.length; i<len ; i++){
592 var tag=subfields[i].substr(4,3);
593 var subfield=subfields[i].substr(17,1);
594 var tagnumber=subfields[i].substr(19,subfields[i].lastIndexOf("_")-19);
595 if (tabflag[tag+subfield+tagnumber] == null) {
596 tabflag[tag+subfield+tagnumber]=new Array();
597 tabflag[tag+subfield+tagnumber][0]=0;
599 if( tabflag[tag+subfield+tagnumber][0] != 1 && (document.getElementById(subfields[i]) != null && ! document.getElementById(subfields[i]).value || document.getElementById(subfields[i]) == null)){
600 tabflag[tag+subfield+tagnumber][0] = 0 + tabflag[tag+subfield+tagnumber] ;
602 var elt = document.getElementById(subfields[i]);
603 if ( elt.nodeName == 'SELECT' ) {
604 $(elt).siblings('.select2').find("span[role='combobox']").addClass(notFilledClass);
606 elt.setAttribute('class','input_marceditor noEnterSubmit ' + notFilledClass);
608 $('#' + subfields[i]).focus();
609 tabflag[tag+subfield+tagnumber][1]=label[i];
610 tabflag[tag+subfield+tagnumber][2]=tab[i];
612 tabflag[tag+subfield+tagnumber][0] = 1;
614 tabflag[tag+subfield+tagnumber][3] = subfields[i];
617 for (var tagsubfieldid in tabflag){
618 if (tabflag[tagsubfieldid][0]==0){
619 var tag=tagsubfieldid.substr(0,3);
620 var subfield=tagsubfieldid.substr(3,1);
621 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>';
626 /* Check for mandatories/importants field(not subfields) */
627 /* Loop over array of fields identified as mandatory or
628 important to see if at least one subfield is filled */
629 mandatoryFields = new Object();
631 for(var i=0,len=fields.length; i<len; i++){
634 divid = "tag_" + arr[0] + "_" + arr[1];
635 varegexp = new RegExp("^tag_" + arr[0] + "_code_");
637 if(parseInt(arr[0]) >= 10){
638 elem = document.getElementById(divid);
639 eleminputs = elem.getElementsByTagName('input');
641 for(var j=0,len2=eleminputs.length; j<len2; j++){
643 if(eleminputs[j].name.match(varegexp) && eleminputs[j].value){
644 inputregexp = new RegExp("^tag_" + arr[0] + "_subfield_" + eleminputs[j].value + "_" + arr[2]);
646 for( var k=0; k<len2; k++){
647 if( eleminputs[k].id.match(inputregexp) ){
648 if( eleminputs[k].value ){
654 elemselect = elem.getElementsByTagName('select');
655 for( var k=0; k<elemselect.length; k++){
656 if(elemselect[k].id.match(inputregexp) && elemselect[k].value){
663 elemtextareas = elem.getElementsByTagName('textarea');
664 for(var j=0,len2=elemtextareas.length; j<len2; j++){
665 // this bit assumes that the only textareas in this context would be for subfields
666 if (elemtextareas[j].value) {
678 mandatoryFields[ arr[0] ] = {
679 importance: "mandatory",
680 elemid: "div_indicator_" + divid,
684 mandatoryFields[ arr[0] ] = {
685 importance: "important",
686 elemid: "div_indicator_" + divid,
694 if( Object.entries(mandatoryFields).length > 0 ){
695 StrAlert += "<h4>" + _("The following fields aren't filled:") + "</h4>";
697 for( var prop in mandatoryFields ){
698 if( mandatoryFields[prop]["importance"] == "mandatory" ){
699 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>';
701 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>';
706 StrAlert += "</div>";
708 $("#show-errors").html('<button type="button" class="btn btn-danger show-errors"><i class="fa fa-warning"></i> ' + _("Errors") + '</span>');
716 * Run checks for mandatory and important fields
717 * Output errors if necessary, or submit the form
720 var StrAlert = AreFieldsNotOk();
721 var StrWarning = AreFieldsNotOk( false );
722 if( !StrAlert && StrWarning ){
723 // Check important fields
724 $("#check_errors").html( StrWarning );
725 $('html, body').animate({ scrollTop: 0 }, 'fast');
727 var r=confirm( _("Important fields(s) are not filled. Are you sure you want to save?" ) );
734 } else if( StrAlert ){
735 var strAll = StrAlert;
737 strAll += StrWarning;
739 $("#check_errors").html( strAll );
740 $('html, body').animate({ scrollTop: 0 }, 'fast');
741 Sticky.hcSticky('refresh');
743 } else if( !StrAlert && !StrWarning ){
750 * check if z3950 mandatories are set or not
752 function GetZ3950Terms(){
753 var frameworkcode = document.getElementById("frameworkcode").value;
754 var strQuery = "&frameworkcode=" + encodeURIComponent(frameworkcode);
755 var mandatories = new Array();
756 var mandatories_label = new Array();
757 [% FOREACH BIG_LOO IN BIG_LOOP %]
758 [% FOREACH innerloo IN BIG_LOO.innerloop %]
759 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
760 [% IF ( subfield_loo.z3950_mandatory ) %]
761 mandatories.push("[% subfield_loo.id | html %]");
762 mandatories_label.push("[% subfield_loo.z3950_mandatory | html %]");
768 for(var i=0,len=mandatories.length; i<len ; i++){
769 var field_value = document.getElementById(mandatories[i]).value;
771 strQuery += "&"+encodeURIComponent(mandatories_label[i])+"="+encodeURIComponent(field_value);
777 function Changefwk() {
779 f.op.value = "[% op | html %]";
780 f.biblionumber.value = "[% biblionumberdata | html %]";
781 f.changed_framework.value = "changed";
785 /* Wrap a value in HTML without putting HTML in translatable string */
786 function formatFieldName( string ){
787 return "<strong><em>" + string + "</em></strong>";
790 [% Asset.css("css/addbiblio.css") | $raw %]
792 <body id="cat_addbiblio" class="cat">
795 <div>Loading, please wait...</div>
798 [% INCLUDE 'header.inc' %]
799 [% INCLUDE 'cataloging-search.inc' %]
801 <nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb">
804 <a href="/cgi-bin/koha/mainpage.pl">Home</a>
807 <a href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cataloging</a>
810 <a href="#" aria-current="page">
811 [% IF ( biblionumber ) %]
812 Editing <em>[% title | html %]</em> (Record number [% biblionumber | html %])
821 <div class="main container-fluid">
823 <div class="col-md-10 col-md-offset-1">
825 <div id="check_errors"></div>
828 [% IF ( biblionumber ) %]
829 Editing <em>[% title | html %]</em> (Record number [% biblionumber | html %])
831 Add MARC record [% IF (circborrowernumber) %]<em>(fast cataloging)</em>[% END %]
835 [% UNLESS ( number ) %]
836 <!-- show duplicate warning on tab 0 only -->
837 [% IF ( duplicatebiblionumber ) %]
838 <div class="dialog alert">
839 <h3>Duplicate record suspected</h3>
840 <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>
841 [% IF ( CAN_user_editcatalogue_edit_items ) %]
842 <form action="/cgi-bin/koha/cataloguing/additem.pl" method="get">
843 <input type="hidden" name="biblionumber" value="[% duplicatebiblionumber | html %]" />
844 <button type="submit" class="new"><i class="fa fa-fw fa-pencil"></i> Yes, edit existing items</button>
847 <form action="/cgi-bin/koha/catalogue/detail.pl" method="get">
848 <input type="hidden" name="biblionumber" value="[% duplicatebiblionumber | html %]" />
849 <input type="submit" value="Yes: View existing items" />
852 <form action="/cgi-bin/koha/cataloguing/addbiblio.pl" method="get">
853 [% IF ( CAN_user_editcatalogue_edit_items ) %]
854 <button type="submit" class="new" onclick="confirmnotdup('items'); return false;"><i class="fa fa-fw fa-save"></i> No, save as new record</button>
856 <button type="submit" class="new" onclick="confirmnotdup('view'); return false;"><i class="fa fa-fw fa-save"></i> No, save as new record</button>
859 </div> <!-- /.dialog.alert -->
860 [% END # /IF duplicatebiblionumber %]
861 [% END # /UNLESS number %]
865 opener.document.forms['f'].biblionumber.value=[% biblionumber | html %];
866 opener.document.forms['f'].title.value='[% title | html %]';
870 <form method="post" name="f" id="f" action="/cgi-bin/koha/cataloguing/addbiblio.pl" onsubmit="return Check();">
871 <input type="hidden" value="[% IF ( biblionumber ) %]view[% ELSE %]items[% END %]" id="redirect" name="redirect" />
872 <input type="hidden" value="" id="current_tab" name="current_tab" />
873 <input type="hidden" value="0" id="confirm_not_duplicate" name="confirm_not_duplicate" />
876 <div id="toolbar" class="btn-toolbar">
877 [% IF CAN_user_editcatalogue_edit_items or ( frameworkcode == 'FA' and CAN_user_editcatalogue_fast_cataloging ) %]
878 [% IF (circborrowernumber) %][%# fast cataloging must lead to items %]
879 <!-- Action is under fast cataloging - Save button redirecting to items -->
880 <div class="btn-group"><a href="#" id="saveanditems" class="btn btn-primary"><i class="fa fa-save"></i> Save</a></div>
882 <!-- Not using fast cataloging - Display split menu -->
883 <div class="btn-group">
884 <button class="btn btn-primary" id="saverecord"><i class="fa fa-save"></i> Save</button>
885 <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
886 <span class="caret"></span>
888 <ul class="dropdown-menu">
889 <li><a id="saveandview" href="#">Save and view record</a></li>
890 <li><a id="saveanditems" href="#">Save and edit items</a></li>
891 <li><a id="saveandcontinue" href="#">Save and continue editing</a></li>
896 <!-- User cannot edit items - single button redirecting to view -->
897 <div class="btn-group"><a href="#" id="saveandview" class="btn btn-default"><i class="fa fa-save"></i> Save</a></div>
898 [% END # /IF CAN_user_editcatalogue_edit_items %]
900 [% UNLESS (circborrowernumber) %][%# Hide in fast cataloging %]
901 [% IF biblionumber %]
902 <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>
904 <div class="btn-group"><a class="btn btn-default" href="#" id="z3950search"><i class="fa fa-search"></i> Z39.50/SRU search</a></div>
906 [% IF ( CAN_user_editauthorities ) %]
907 <div class="btn-group"><a class="btn btn-default" href="#" id="linkerbutton"><i class="fa fa-refresh"></i> Link authorities automatically</a></div>
911 <div class="btn-group">
912 <button class="btn btn-default dropdown-toggle" data-toggle="dropdown"><i class="fa fa-cog"></i> Settings <span class="caret"></span></button>
913 <ul id="settings-menu" class="dropdown-menu">
914 [% IF Koha.Preference( 'EnableAdvancedCatalogingEditor' ) == 1 && CAN_user_editcatalogue_advanced_editor %]
915 <li><a href="#" id="switcheditor">Switch to advanced editor</a></li>
917 [% UNLESS advancedMARCEditor %]
919 <a href="#" id="marcDocsSelect"><i class="fa fa-check-square-o"></i> Show MARC tag documentation links</a>
921 <a href="#" id="marcTagsSelect"><i class="fa fa-check-square-o"></i> Show tags</a>
924 <li class="dropdown-header">Change framework</li>
926 <a href="#" class="change-framework" data-frameworkcode="">
927 [% IF ( frameworkcode ) %]
928 <i class="fa fa-fw"> </i>
930 <i class="fa fa-fw fa-check"></i>
935 [% FOREACH framework IN frameworks%]
937 <a href="#" class="change-framework" data-frameworkcode="[% framework.frameworkcode | html %]">
938 [% IF framework.frameworkcode == frameworkcode %]
939 <i class="fa fa-fw fa-check"></i>
941 <i class="fa fa-fw"> </i>
943 [% framework.frameworktext | html %]
947 </ul> <!-- /#settings-menu -->
948 </div> <!-- /.btn-group -->
949 [% UNLESS (circborrowernumber) %][%# Hide in fast cataloging %]
950 [% IF (biblionumber) %]
951 <div class="btn-group">
952 <a href="[% PROCESS biblio_a_href biblionumber => biblionumber %]" class="btn btn-link" id="cancel">Cancel</a>
955 <div class="btn-group">
956 <a class="btn btn-link" id="cancel" href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cancel</a>
959 <div id="show-errors" class="btn-group"></div>
960 [% END # /UNLESS circborrowernumber %]
961 <div class="toolbar-tabs-container">
962 [% IF ( BIG_LOOP && BIG_LOOP.size > 1 ) %]
963 <ul class="toolbar-tabs" role="tablist">
964 [%- FOREACH BIG_LOO IN BIG_LOOP -%]
966 <li role="presentation" class="active selected">
968 <li role="presentation">
970 <a data-tabid="[% BIG_LOO.number | html %]" href="#tab[% BIG_LOO.number | html %]XX" aria-controls="#tab[% BIG_LOO.number | html %]XX" role="tab" data-toggle="tab">[% BIG_LOO.number | html %]</a>
975 <ul class="tag_anchors_list">
976 [% FOREACH BIG_LOO IN BIG_LOOP %]
977 [% IF loop.first %][% SET tab_selected = "tab_selected" %][% ELSE %][% SET tab_selected = "" %][% END %]
978 [% FOREACH innerloo IN BIG_LOO.innerloop %]
979 [% IF ( innerloo.tag ) %]
980 <li class="tag_anchors tag_anchors_[% BIG_LOO.number | html %] [% tab_selected | html %]">
981 <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>
988 </div> <!-- /#toolbar.btn-toolbar -->
990 [% IF bib_doesnt_exist %]
991 <div class="dialog alert">
992 The record you are trying to edit doesn't exist.<br>
993 <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>.
998 <input type="hidden" name="mode" value="popup" />
1000 <input type="hidden" name="op" value="addbiblio" />
1001 <input type="hidden" id="frameworkcode" name="frameworkcode" value="[% frameworkcode | html %]" />
1002 <input type="hidden" name="z3950" value="[% z3950 | html %]" />
1003 <input type="hidden" name="biblionumber" value="[% biblionumber | html %]" />
1004 <input type="hidden" name="breedingid" value="[% breedingid | html %]" />
1005 <input type="hidden" name="changed_framework" value="" />
1007 <div id="addbibliotabs" class="toptabs numbered">
1008 <div class="tab-content">
1010 [% FOREACH BIG_LOO IN BIG_LOOP %]
1012 <div id="tab[% BIG_LOO.number | html %]XX" role="tabpanel" class="tab-pane active">
1014 <div id="tab[% BIG_LOO.number | html %]XX" role="tabpanel" class="tab-pane">
1017 [% IF ( BIG_LOOP.size > 1 ) %]
1018 <h3>Section [% BIG_LOO.number | html %]</h3>
1021 [% FOREACH innerloo IN BIG_LOO.innerloop %]
1022 [% IF ( innerloo.tag ) %]
1023 [% IF innerloo.tag != previous %]
1024 [% IF previous != "" %]
1027 [% previous = innerloo.tag %]
1028 [% IF ( innerloo.repeatable ) %]
1029 <ul class="sortable_field">
1034 [% IF ( innerloo.repeatable ) %]
1035 <li class="tag sortable_tag clearfix" id="tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]">
1037 <li class="tag clearfix" id="tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]">
1039 <div class="tag_title" id="div_indicator_tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]">
1040 [% IF advancedMARCEditor %]
1041 <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>
1043 <span class="tagnum" title="[% innerloo.tag_lib | html %]">[% innerloo.tag | html %]</span>
1044 <a href="#" class="marcdocs" onclick="PopupMARCFieldDoc('[% innerloo.tag | html %]'); return false;"> ?</a>
1047 [% IF ( innerloo.fixedfield ) %]
1050 class="indicator flat"
1051 style="display:none;"
1052 name="tag_[% innerloo.tag | html %]_indicator1_[% innerloo.index | html %][% innerloo.random | html %]"
1055 value="[% innerloo.indicator1 | html %]" />
1058 class="indicator flat"
1059 style="display:none;"
1060 name="tag_[% innerloo.tag | html %]_indicator2_[% innerloo.index | html %][% innerloo.random | html %]"
1063 value="[% innerloo.indicator2 | html %]" />
1067 class="indicator flat"
1068 name="tag_[% innerloo.tag | html %]_indicator1_[% innerloo.index | html %][% innerloo.random | html %]"
1071 value="[% innerloo.indicator1 | html %]" />
1074 class="indicator flat"
1075 name="tag_[% innerloo.tag | html %]_indicator2_[% innerloo.index | html %][% innerloo.random | html %]"
1078 value="[% innerloo.indicator2 | html %]" />
1079 [% END # /IF innerloo.fixedfield %] -
1081 [% UNLESS advancedMARCEditor %]
1082 <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>
1085 <span class="field_controls">
1086 [% IF ( innerloo.repeatable ) %]
1087 <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">
1088 <img src="[% interface | html %]/[% theme | html %]/img/repeat-tag.png" alt="Repeat this tag" />
1091 <a href="#" tabindex="1" class="buttonMinus" onclick="UnCloneField('tag_[% innerloo.tag | html %]_[% innerloo.index | html %][% innerloo.random | html %]'); return false;" title="Delete this tag">
1092 <img src="[% interface | html %]/[% theme | html %]/img/delete-tag.png" alt="Delete this tag" />
1094 </span> <!-- /.field_controls -->
1095 </div> <!-- /div.tag_title -->
1097 <ul class="sortable_subfield">
1098 [% FOREACH subfield_loo IN innerloo.subfield_loop %]
1099 <!-- One line on the marc editor -->
1100 <li class="subfield_line" style="[% subfield_loo.visibility | html %]" id="subfield[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]">
1101 <div class="subfieldcode">
1103 title="[% subfield_loo.marc_lib | $raw %]"
1104 style=" [% IF ( subfield_loo.fixedfield ) %]display:none; [% END %]border:0;"
1105 name="tag_[% subfield_loo.tag | html %]_code_[% subfield_loo.subfield | html %]_[% subfield_loo.index | html %]_[% subfield_loo.index_subfield | html %]"
1106 value="[% subfield_loo.subfield | html %]"
1112 [% UNLESS advancedMARCEditor %]
1113 [% IF ( subfield_loo.mandatory ) %]
1114 <div class="subfield subfield_mandatory">
1115 [% ELSIF ( subfield_loo.important ) %]
1116 <div class="subfield subfield_important">
1118 <div class="subfield">
1120 [% IF ( subfield_loo.fixedfield ) %]
1121 <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">
1123 <label for="tag_[% subfield_loo.tag | html %]_subfield_[% subfield_loo.subfield | html %]_[% subfield_loo.index | html %]_[% subfield_loo.index_subfield | html %]" class="labelsubfield">
1125 [% subfield_loo.marc_lib | $raw %]
1130 [% SET mv = subfield_loo.marc_value %]
1131 <div id="field_marceditor[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]" class="field_marceditor">
1132 [% IF ( mv.type == 'text' ) %]
1133 [% IF ( mv.readonly == 1 ) %]
1134 <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" />
1136 <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 -%]" />
1139 [% ELSIF ( mv.type == 'text_complex' ) %]
1140 <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 -%]" />
1141 [% mv.javascript | $raw %]
1142 [% ELSIF ( mv.type == 'hidden' ) %]
1143 <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 -%]" />
1144 [% ELSIF ( mv.type == 'textarea' ) %]
1145 <textarea cols="70" rows="4" id="[%- mv.id | html -%]" name="[%- mv.name | html -%]" class="input_marceditor" tabindex="1">[%- mv.value | html -%]</textarea>
1146 [% ELSIF ( mv.type == 'select' ) %]
1147 [% IF mv.category AND CAN_user_parameters_manage_auth_values %]
1148 <select name="[%- mv.name | html -%]" tabindex="1" class="input_marceditor" id="[%- mv.id | html -%]" data-category="[% mv.category | html %]">
1150 <select name="[%- mv.name | html -%]" tabindex="1" class="input_marceditor select2" id="[%- mv.id | html -%]">
1152 [% SET matched = 0 %]
1153 [% FOREACH aval IN mv.values %]
1154 [% IF aval == mv.default %]
1155 [% SET matched = 1 %]
1156 <option value="[%- aval | html -%]" selected="selected">[%- mv.labels.$aval | html -%]</option>
1158 <option value="[%- aval | html -%]">[%- mv.labels.$aval | html -%]</option>
1162 [% UNLESS matched # If the current value is not in the authorised value list %]
1163 <option value="[%- mv.default | html -%]" selected="selected">[%- mv.default | html -%] (Not an authorised value)</option>
1165 <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>
1169 [% UNLESS matched # If the current value is not in the authorised list %]
1171 [% END # /IF (mv.type...) %]
1173 [% IF ( subfield_loo.mandatory ) %]
1174 <div class="subfield_loop_mandatory">
1175 <span class="required">Required</span>
1177 [% ELSIF ( subfield_loo.important ) %]
1178 <div class="subfield_loop_mandatory">
1179 <span class="important">Important</span>
1182 <div class="subfield_controls">
1183 [% IF ( mv.type == 'text' ) %]
1184 [% IF ( mv.authtype ) %]
1185 <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>
1187 [% ELSIF ( mv.type == 'text_complex' ) %]
1189 <span class="buttonDot tag_editor disabled" tabindex="-1" title="Field autofilled by plugin"></span>
1191 [% IF mv.plugin == "upload.pl" %]
1192 <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>
1194 <a href="#" id="buttonDot_[% mv.id | html %]" class="buttonDot tag_editor framework_plugin" tabindex="1" title="Tag editor">Tag editor</a>
1199 [% IF ( subfield_loo.repeatable ) %]
1200 <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;">
1201 <img src="[% interface | html %]/[% theme | html %]/img/clone-subfield.png" alt="Clone" title="Clone this subfield" />
1203 <a href="#" class="buttonMinus" tabindex="1" onclick="UnCloneField('subfield[% subfield_loo.tag | html %][% subfield_loo.subfield | html %][% subfield_loo.random | html %]'); return false;">
1204 <img src="[% interface | html %]/[% theme | html %]/img/delete-subfield.png" alt="Delete" title="Delete this subfield" />
1208 </li> <!-- /.subfield_line -->
1209 <!-- End of the line -->
1210 [% END # /FOREACH subfield_loop %]
1211 </ul> <!-- /.sortable_subfield -->
1212 </li> <!-- /.tag.clearfix -->
1213 [% END %]<!-- if innerloo.tag -->
1214 [% END # /FOREACH BIG_LOO.innerloop %]
1215 </ul> <!-- /.sortable_field -->
1216 </div> <!-- /#tabXXX -->
1217 [% END # /FOREACH BIG_LOOP %]
1218 </div> <!-- /.tab-content -->
1219 </div><!-- /#addbibliotabs -->
1221 [%# Fields for fast cataloging %]
1222 <input type="hidden" name="barcode" value="[% barcode | html %]" />
1223 <input type="hidden" name="branch" value="[% branch | html %]" />
1224 <input type="hidden" name="circborrowernumber" value="[% circborrowernumber | html %]" />
1225 <input type="hidden" name="stickyduedate" value="[% stickyduedate | html %]" />
1226 <input type="hidden" name="duedatespec" value="[% duedatespec | html %]" />
1227 [%# End of fields for fast cataloging %]
1228 </form> <!-- /name=f -->
1230 [% INCLUDE 'modals/cataloguing_create_av.inc' %]
1232 </div> <!-- /.col-md-10.col-md-offset-1 -->
1233 </div> <!-- /.row -->
1235 [% INCLUDE 'intranet-bottom.inc' %]