From 2f860e36f6184011db71818eb282cf3035845c93 Mon Sep 17 00:00:00 2001 From: Fridolyn SOMERS Date: Fri, 13 Jul 2012 15:26:34 +0200 Subject: [PATCH 1/4] Bug 7455: Authority subfields are cloned in the wrong field Signed-off-by: Jared Camins-Esakov Passed-QA-by: Mason James Signed-off-by: Jared Camins-Esakov --- cataloguing/additem.pl | 6 +- .../intranet-tmpl/prog/en/css/addbiblio.css | 10 +- .../intranet-tmpl/prog/en/js/cataloging.js | 463 +++++++++++++ .../en/modules/authorities/authorities.tt | 648 +++++------------- .../authorities/blinddetail-biblio-search.tt | 2 +- .../prog/en/modules/cataloguing/addbiblio.tt | 605 ++++------------ .../prog/en/modules/cataloguing/additem.tt | 77 +-- .../prog/en/modules/serials/serials-edit.tt | 82 +-- .../prog/en/modules/tools/batchMod-edit.tt | 5 +- tools/batchMod.pl | 6 +- 10 files changed, 792 insertions(+), 1112 deletions(-) create mode 100644 koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index 7b7dbac671..79a717c54f 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -247,7 +247,7 @@ sub generate_subfield_form { my $change = index($javascript, 'function Change') > -1 ? "return Change$function_name($subfield_data{random}, '$subfield_data{id}');" : 'return 1;'; - $subfield_data{marc_value} = qq[ @@ -255,7 +255,7 @@ sub generate_subfield_form { $javascript]; } else { warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = ""; # supply default input form + $subfield_data{marc_value} = ""; # supply default input form } } elsif ( $tag eq '' ) { # it's an hidden field @@ -274,7 +274,7 @@ sub generate_subfield_form { $subfield_data{marc_value} = "\n"; } else { # it's a standard field - $subfield_data{marc_value} = ""; + $subfield_data{marc_value} = ""; } return \%subfield_data; diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/addbiblio.css b/koha-tmpl/intranet-tmpl/prog/en/css/addbiblio.css index d2489b3f36..d35a471805 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/css/addbiblio.css +++ b/koha-tmpl/intranet-tmpl/prog/en/css/addbiblio.css @@ -50,8 +50,10 @@ div.tag { } div.subfield_line { - padding-bottom : .3em; - clear: both; + padding-bottom: .3em; + float: left; + clear: left; + width: 100%; } div.subfield_line label { @@ -63,6 +65,10 @@ div.subfield_line label { clear:left; } +.subfieldcode img { + cursor: pointer; +} + .tag_title { font-size : 90%; padding : .2em 0; diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js new file mode 100644 index 0000000000..1baf7948b6 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js @@ -0,0 +1,463 @@ +/* + * Unified file for catalogue edition + */ + +/* Functions developed for addbiblio.tt and authorities.tt */ + +// returns the fieldcode based upon tag div id +function getFieldCode(tagDivId){ + // format : tag__... + return tagDivId.substr(3+1,3); +} + +//returns the field and subfieldcode based upon subfield div id +function getFieldAndSubfieldCode(subfieldDivId){ + // format : subfield... + return subfieldDivId.substr(8,3+1); +} + +//returns the subfieldcode based upon subfieldid writing +function getSubfieldCode(tagsubfieldid){ + // 3 : tag +3 : tagnumber +4 : number of _ +8 subfield -1 begins at 0 + return tagsubfieldid.substr(3+3+4+8-1,1); +} + +// Take the base of tagsubfield information (removing the subfieldcodes and subfieldindexes) +// returns the filter +function getTagInputnameFilter(tagsubfieldid){ + var tagsubfield=tagsubfieldid.substr(0,tagsubfieldid.lastIndexOf("_")); + var tagcode=tagsubfield.substr(tagsubfield.lastIndexOf("_")); + tagsubfield=tagsubfield.substr(0,tagsubfield.lastIndexOf("_")); + tagsubfield=tagsubfield.substr(0,tagsubfield.lastIndexOf("_")); + tagsubfield=tagsubfield+"_."+tagcode; + return tagsubfield; +} + +function openAuth(tagsubfieldid,authtype) { + // let's take the base of tagsubfield information (removing the indexes and the codes + var element=document.getElementById(tagsubfieldid); + var tagsubfield=getTagInputnameFilter(tagsubfieldid); + var elementsubfcode=getSubfieldCode(element.name); + var mainmainstring=element.value; + var mainstring=""; + var inputs = element.parentNode.parentNode.getElementsByTagName("input"); + + for (var myindex =0; myindex + var divs = original.getElementsByTagName('div'); + for(var i=0,divslen = divs.length ; i show all subfields + divs[i].style.display = 'block'; + } else if (divs[i].style.display == 'none') { + // show + divs[i].style.display = 'block'; + } else { + // hide + divs[i].style.display = 'none'; + } + } + } +} +/** + * To clone a field + * @param hideMarc '0' for false, '1' for true + * @param advancedMARCEditor '0' for false, '1' for true + */ +function CloneField(index, hideMarc, advancedMARCEditor) { + var original = document.getElementById(index); //original
+ var clone = original.cloneNode(true); + var new_key = CreateKey(); + var new_id = original.getAttribute('id')+new_key; + + clone.setAttribute('id',new_id); // setting a new id for the parent div + + var divs = clone.getElementsByTagName('div'); + + if(hideMarc == '0') { + // No indicator if hide_marc + // setting a new name for the new indicator + for(var i=0; i < 2; i++) { + var indicator = clone.getElementsByTagName('input')[i]; + indicator.setAttribute('name',indicator.getAttribute('name')+new_key); + } + } + + // settings all subfields + for(var i=0,divslen = divs.length ; i + var clone = original.cloneNode(true); + var new_key = CreateKey(); + + // set the attribute for the new 'div' subfields + var inputs = clone.getElementsByTagName('input'); + var selects = clone.getElementsByTagName('select'); + var textareas = clone.getElementsByTagName('textarea'); + var linkid; + + // input + var id_input = ""; + for(var i=0,len=inputs.length; i 1) { + canUnclone = true; + } + } else { + // unclone a subfield, check if there will remain one subfield + var subfieldCode = getFieldAndSubfieldCode(index); + // subfield divs with id begining with original field and subfield field code + var cloneSubfields = $('.subfield_line[id^="subfield'+subfieldCode+'"]'); + if (cloneSubfields.length > 1) { + canUnclone = true; + } + } + if (canUnclone) { + // remove clone + original.parentNode.removeChild(original); + } else { + // clear inputs, but don't delete + $(":input.input_marceditor", original).each(function(){ + // thanks to http://www.learningjquery.com/2007/08/clearing-form-data for + // hint about clearing selects correctly + var type = this.type; + var tag = this.tagName.toLowerCase(); + if (type == 'text' || type == 'password' || tag == 'textarea') { + this.value = ""; + } else if (type == 'checkbox' || type == 'radio') { + this.checked = false; + } else if (tag == 'select') { + this.selectedIndex = -1; + } + }); + $(":input.indicator", original).val(""); + } +} + +/** + * This function create a random number + */ +function CreateKey(){ + return parseInt(Math.random() * 100000); +} + +/** + * This function allows to move a subfield up by clickink on the 'up' button . + */ +function upSubfield(index) { + try{ + var line = document.getElementById(index); // get the line where the user has clicked. + } catch(e) { + return; // this line doesn't exist... + } + var tag = line.parentNode; // get the dad of this line. (should be "
") + + // getting all subfields for this tag + var subfields = tag.getElementsByTagName('div'); + var subfieldsLength = subfields.length; + + if(subfieldsLength<=1) return; // nothing to do if there is just one subfield. + + // among all subfields + for(var i=0;i + * @param original subfield div to clone + */ +function CloneItemSubfield(original){ + var clone = original.cloneNode(true); + var new_key = CreateKey(); + + // set the attribute for the new 'div' subfields + var inputs = clone.getElementsByTagName('input'); + var selects = clone.getElementsByTagName('select'); + var textareas = clone.getElementsByTagName('textarea'); + + // input (except hidden type) + var id_input = ""; + for(var i=0,len=inputs.length; iKoha › Authorities › [% IF ( authid ) %]Modify authority #[% authid %] ([% authtypetext %])[% ELSE %]Adding authority ([% authtypetext %])[% END %] [% INCLUDE 'doc-head-close.inc' %] + + @@ -657,6 +267,7 @@ function unHideSubfield(index,labelindex) { // FIXME :: is it used ? //]]> [% INCLUDE 'header.inc' %] +
@@ -802,83 +413,129 @@ function unHideSubfield(index,labelindex) { // FIXME :: is it used ?
- + [% FOREACH BIG_LOO IN BIG_LOOP %] - -[% IF ( BIG_LOO.number ) %]
-[% ELSE %] -
-[% END %] - [% FOREACH innerloo IN BIG_LOO.innerloop %] - [% IF ( innerloo.tag ) %] -
+ [% IF ( innerloo.tag ) %] +
- [% UNLESS hide_marc %] - [% IF advancedMARCEditor %] - [% innerloo.tag %] - [% ELSE %] - [% innerloo.tag %] - [% IF marcflavour != 'NORMARC' %] ?[% END %] - - [% END %] - [% IF ( innerloo.fixedfield ) %] - - - [% ELSE %] - - - [% END %] - + [% UNLESS hide_marc %] + [% IF advancedMARCEditor %] + [% innerloo.tag %] [% ELSE %] - [% IF ( innerloo.fixedfield ) %] - - - [% ELSE %] - - - [% END %] + [% innerloo.tag %] + [% IF marcflavour != 'NORMARC' %] ?[% END %] + [% END %] + [% IF ( innerloo.fixedfield ) %] + + + [% ELSE %] + + + [% END %] - + [% ELSE %] + [% IF ( innerloo.fixedfield ) %] + + + [% ELSE %] + + + [% END %] + [% END %] [% UNLESS advancedMARCEditor %] - [% innerloo.tag_lib %] + [% innerloo.tag_lib %] [% END %] - [% IF ( innerloo.repeatable ) %] - Repeat this Tag - [% END %] - Delete this Tag + + [% IF ( innerloo.repeatable ) %] + + Repeat this Tag + + [% END %] + + Delete this Tag + + -
- + [% FOREACH subfield_loo IN innerloo.subfield_loop %] -
+
[% UNLESS advancedMARCEditor %] [% IF ( subfield_loo.fixedfield ) %]
- [% END %] -
- [% END %] - [% END %] +
-[% END %] -
+ [% END %] + [% END %] +
+[% END %] + +
+ @@ -914,6 +578,7 @@ function unHideSubfield(index,labelindex) { // FIXME :: is it used ? +
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt index 05750b2927..2c33df8267 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt @@ -1,6 +1,7 @@ [% INCLUDE 'doc-head-open.inc' %] Koha › Cataloging › [% title |html %] [% IF ( author ) %] by [% author %][% END %] (Record #[% biblionumber %]) › Items [% INCLUDE 'doc-head-close.inc' %] + + @@ -163,7 +164,9 @@ $(document).ready(function(){ [% IF ( ite.repeatable ) %] - + + + Clone + [% END %]
diff --git a/tools/batchMod.pl b/tools/batchMod.pl index f0ea8f85d0..2c68bd377b 100755 --- a/tools/batchMod.pl +++ b/tools/batchMod.pl @@ -394,14 +394,14 @@ foreach my $tag (sort keys %{$tagslib}) { my $temp; my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data ); my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data ); - $subfield_data{marc_value} = qq[ ... $javascript]; } else { warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = ""; # supply default input form + $subfield_data{marc_value} = ""; # supply default input form } } elsif ( $tag eq '' ) { # it's an hidden field @@ -420,7 +420,7 @@ foreach my $tag (sort keys %{$tagslib}) { $subfield_data{marc_value} = "\n"; } else { # it's a standard field - $subfield_data{marc_value} = ""; + $subfield_data{marc_value} = ""; } # $subfield_data{marc_value}=""; push (@loop_data, \%subfield_data); From eabe69870556466ff86920a10568df8ca7ae90f4 Mon Sep 17 00:00:00 2001 From: Fridolyn SOMERS Date: Tue, 28 Aug 2012 14:55:01 +0200 Subject: [PATCH 2/4] Bug 7455: Authority subfields are cloned in the wrong field (follow-up) Signed-off-by: Jared Camins-Esakov Passed-QA-by: Mason James Signed-off-by: Jared Camins-Esakov --- authorities/authorities.pl | 16 +++++++++------- koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js | 4 ++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/authorities/authorities.pl b/authorities/authorities.pl index b63f7e411e..6ddb337339 100755 --- a/authorities/authorities.pl +++ b/authorities/authorities.pl @@ -152,9 +152,15 @@ sub create_input { $value =~ s/DD/$day/g; } my $dbh = C4::Context->dbh; + + # map '@' as "subfield" label for fixed fields + # to something that's allowed in a div id. + my $id_subfield = $subfield; + $id_subfield = "00" if $id_subfield eq "@"; + my %subfield_data = ( tag => $tag, - subfield => $subfield, + subfield => $id_subfield, marc_lib => substr( $tagslib->{$tag}->{$subfield}->{lib}, 0, 22 ), marc_lib_plain => $tagslib->{$tag}->{$subfield}->{lib}, tag_mandatory => $tagslib->{$tag}->{mandatory}, @@ -162,14 +168,10 @@ sub create_input { repeatable => $tagslib->{$tag}->{$subfield}->{repeatable}, kohafield => $tagslib->{$tag}->{$subfield}->{kohafield}, index => $index_tag, - id => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, + id => "tag_".$tag."_subfield_".$id_subfield."_".$index_tag."_".$index_subfield, value => $value, + random => CreateKey(), ); - if($subfield eq '@'){ - $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_tag."_".$index_subfield; - } else { - $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield; - } if(exists $mandatory_z3950->{$tag.$subfield}){ $subfield_data{z3950_mandatory} = $mandatory_z3950->{$tag.$subfield}; diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js index 1baf7948b6..b9e0f23955 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js +++ b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js @@ -211,6 +211,10 @@ function CloneField(index, hideMarc, advancedMARCEditor) { } else { // it's a indicator div if(divs[i].getAttribute('id').match(/^div_indicator/)){ + + // setting a new id for the indicator div + divs[i].setAttribute('id',divs[i].getAttribute('id')+new_key); + var inputs = divs[i].getElementsByTagName('input'); inputs[0].setAttribute('id',inputs[0].getAttribute('id')+new_key); inputs[1].setAttribute('id',inputs[1].getAttribute('id')+new_key); From 7cf5e2e954b8874b5ddc3d9ecb1bf50ed0b11293 Mon Sep 17 00:00:00 2001 From: Fridolyn SOMERS Date: Tue, 18 Sep 2012 17:34:51 +0200 Subject: [PATCH 3/4] Bug 7455: Authority subfields are cloned in the wrong field (follow-up 2) Signed-off-by: Jared Camins-Esakov Passed-QA-by: Mason James Signed-off-by: Jared Camins-Esakov --- authorities/authorities.pl | 2 +- cataloguing/addbiblio.pl | 25 +++--------- .../intranet-tmpl/prog/en/js/cataloging.js | 5 ++- .../en/modules/authorities/authorities.tt | 38 ------------------- 4 files changed, 10 insertions(+), 60 deletions(-) diff --git a/authorities/authorities.pl b/authorities/authorities.pl index 6ddb337339..ee842e0266 100755 --- a/authorities/authorities.pl +++ b/authorities/authorities.pl @@ -199,7 +199,7 @@ sub create_input { class=\"input_marceditor\" tabindex=\"1\" \/> {$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">... + onclick=\"openAuth(this.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."','auth'); return false;\" tabindex=\"1\" title=\"Tag Editor\">... "; # it's a plugin field } diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl index 3db1a65526..2d591c6ba5 100755 --- a/cataloguing/addbiblio.pl +++ b/cataloguing/addbiblio.pl @@ -372,7 +372,8 @@ sub create_input { # it's a thesaurus / authority field } elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) { - if (C4::Context->preference("BiblioAddsAuthorities")) { + # when authorities auto-creation is allowed, do not set readonly + my $is_readonly = !C4::Context->preference("BiblioAddsAuthorities"); $subfield_data{marc_value} = " + maxlength=\"".$subfield_data{maxlength}."\"". + ($is_readonly ? "readonly=\"readonly\"" : ""). + "\/> {$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">\"Tag + onclick=\"openAuth(this.parentNode.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."','biblio'); return false;\" tabindex=\"1\" title=\"Tag Editor\">\"Tag "; - } else { - $subfield_data{marc_value} = - "{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">\"Tag - "; - } # it's a plugin field } elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js index b9e0f23955..a2b304a389 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js +++ b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js @@ -33,7 +33,8 @@ function getTagInputnameFilter(tagsubfieldid){ return tagsubfield; } -function openAuth(tagsubfieldid,authtype) { +// if source is "auth", we are editing an authority otherwise it is a biblio +function openAuth(tagsubfieldid,authtype,source) { // let's take the base of tagsubfield information (removing the indexes and the codes var element=document.getElementById(tagsubfieldid); var tagsubfield=getTagInputnameFilter(tagsubfieldid); @@ -50,7 +51,7 @@ function openAuth(tagsubfieldid,authtype) { } } } - newin=window.open("../authorities/auth_finder.pl?authtypecode="+ authtype+ "&index="+tagsubfieldid+"&value_mainstr="+encodeURI(mainmainstring)+"&value_main="+encodeURI(mainstring), "_blank",'width=700,height=550,toolbar=false,scrollbars=yes'); + newin=window.open("../authorities/auth_finder.pl?source="+source+"&authtypecode="+authtype+"&index="+tagsubfieldid+"&value_mainstr="+encodeURI(mainmainstring)+"&value_main="+encodeURI(mainstring), "_blank",'width=700,height=550,toolbar=false,scrollbars=yes'); } function ExpandField(index) { diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/authorities.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/authorities.tt index 4df67467af..5c3d566641 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/authorities.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/authorities.tt @@ -102,44 +102,6 @@ function Check(){ } } - -// returns the subfieldcode based upon subfieldid writing -function getSubfieldcode(tagsubfieldid){ - // 3 : tag +3 : tagnumber +4 : number of _ +8 subfield -1 begins at 0 - return tagsubfieldid.substr(3+3+4+8-1,1); -} - -// Take the base of tagsubfield information (removing the subfieldcodes and subfieldindexes) -// returns the filter -function getTagInputnameFilter(tagsubfieldid){ - var tagsubfield=tagsubfieldid.substr(0,tagsubfieldid.lastIndexOf("_")); - var tagcode=tagsubfield.substr(tagsubfield.lastIndexOf("_")); - tagsubfield=tagsubfield.substr(0,tagsubfield.lastIndexOf("_")); - tagsubfield=tagsubfield.substr(0,tagsubfield.lastIndexOf("_")); - tagsubfield=tagsubfield+"_."+tagcode; - return tagsubfield; -} - -function openAuth(tagsubfieldid,authtype) { - // let's take the base of tagsubfield information (removing the indexes and the codes - var element=document.getElementById(tagsubfieldid); - var tagsubfield=getTagInputnameFilter(tagsubfieldid); - var elementsubfcode=getSubfieldcode(element.name); - var mainmainstring=element.value; - var mainstring=""; - var inputs = element.parentNode.parentNode.getElementsByTagName("input"); - - for (var myindex =0; myindex Date: Thu, 27 Sep 2012 10:14:55 +0200 Subject: [PATCH 4/4] Bug 7455: Authority subfields are cloned in the wrong field (follow-up 3) Signed-off-by: Jared Camins-Esakov Passed-QA-by: Mason James Signed-off-by: Jared Camins-Esakov --- koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js index a2b304a389..e604bdc34c 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js +++ b/koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js @@ -87,13 +87,11 @@ function CloneField(index, hideMarc, advancedMARCEditor) { var divs = clone.getElementsByTagName('div'); - if(hideMarc == '0') { - // No indicator if hide_marc - // setting a new name for the new indicator - for(var i=0; i < 2; i++) { - var indicator = clone.getElementsByTagName('input')[i]; - indicator.setAttribute('name',indicator.getAttribute('name')+new_key); - } + // if hide_marc, indicators are hidden fields + // setting a new name for the new indicator + for(var i=0; i < 2; i++) { + var indicator = clone.getElementsByTagName('input')[i]; + indicator.setAttribute('name',indicator.getAttribute('name')+new_key); } // settings all subfields