@@ -, +, @@ - Old situation: 851 ms - New situation: 942 ms (+10,7%) - New situation after plugin cleanup: 881 ms (+3,4%) - Add/Edit biblio. Try plugins with and without popup. - Add/Edit items. (EXAMPLE can be used as an item plugin with popup.) - Clone a subfield with plugin (use EXAMPLE): Verify that the plugin works on both original and clone with the respective field values. Is the value put back in the right field too? Edit an authority record. Try plugins with an without popup. Set system preference AcqCreateItem to "placing an order". Check the item editor in the following two places: a- addorderiso2709: Open a basket, add an order from a staged file. Select a file, click Add orders, and go to tab Item information. b- neworderempty: Open a basket, add an order from a new empty record. Check the item editor on serials-edit. Go to subscription detail. Click Receive. Choose "Click to add item". (Note that this subscription should create an item record when receiving this serial.) Check the item editor for batch item modification. Enter a few valid barcodes and press Continue to reach the item editor. --- C4/Items.pm | 33 +++++++------ authorities/authorities.pl | 56 +++++++++++----------- cataloguing/addbiblio.pl | 39 ++++++--------- cataloguing/additem.pl | 38 +++++++-------- cataloguing/plugin_launcher.pl | 23 +++------ koha-tmpl/intranet-tmpl/prog/en/js/additem.js | 14 ++++++ koha-tmpl/intranet-tmpl/prog/en/js/cataloging.js | 49 ++++++++++++------- .../prog/en/modules/authorities/authorities.tt | 8 +++- .../prog/en/modules/cataloguing/addbiblio.tt | 10 +++- .../prog/en/modules/tools/batchMod-edit.tt | 8 +++- tools/batchMod.pl | 30 ++++++------ 11 files changed, 169 insertions(+), 139 deletions(-) --- a/C4/Items.pm +++ a/C4/Items.pm @@ -3029,21 +3029,24 @@ sub PrepareItemrecordDisplay { labels => \%authorised_lib, }; } elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { - # opening plugin - my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; - if (do $plugin) { - my $extended_param = plugin_parameters( $dbh, undef, $tagslib, $subfield_data{id}, undef ); - my ( $function_name, $javascript ) = plugin_javascript( $dbh, undef, $tagslib, $subfield_data{id}, undef ); - $subfield_data{random} = int(rand(1000000)); # why do we need 2 different randoms? - $subfield_data{marc_value} = qq[ - ... - $javascript]; - } else { - warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = qq(); # supply default input form - } + # it is a plugin + require Koha::FrameworkPlugin; + my $plugin = Koha::FrameworkPlugin->new({ + name => $tagslib->{$tag}->{$subfield}->{value_builder}, + item_style => 1, + }); + my $pars = { dbh => $dbh, record => undef, tagslib =>$tagslib, id => $subfield_data{id}, tabloop => undef }; + $plugin->build( $pars ); + if( !$plugin->errstr ) { + #TODO Move html to template; see report 12176/13397 + my $tab= $plugin->noclick? '-1': ''; + my $class= $plugin->noclick? ' disabled': ''; + my $title= $plugin->noclick? 'No popup': 'Tag editor'; + $subfield_data{marc_value} = qq[...\n].$plugin->javascript; + } else { + warn $plugin->errstr; + $subfield_data{marc_value} = qq(); # supply default input form + } } elsif ( $tag eq '' ) { # it's an hidden field $subfield_data{marc_value} = qq(); --- a/authorities/authorities.pl +++ a/authorities/authorities.pl @@ -212,37 +212,37 @@ sub create_input { value => $value, authtypecode => $tagslib->{$tag}->{$subfield}->{authtypecode}, }; - # it's a plugin field } - elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { - - # opening plugin. Just check whether we are on a developer computer on a production one - # (the cgidir differs) - my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder"; - unless (-r $cgidir and -d $cgidir) { - $cgidir = C4::Context->intranetdir . "/cataloguing/value_builder"; + elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { # plugin + require Koha::FrameworkPlugin; + my $plugin = Koha::FrameworkPlugin->new({ + name => $tagslib->{$tag}->{$subfield}->{'value_builder'}, + }); + my $pars= { dbh => $dbh, record => $rec, tagslib =>$tagslib, + id => $subfield_data{id}, tabloop => $tabloop }; + $plugin->build( $pars ); + if( !$plugin->errstr ) { + $subfield_data{marc_value} = { + type => 'text2', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + maxlength => $max_length, + javascript => $plugin->javascript, + noclick => $plugin->noclick, + }; + } else { # warn and supply default field + warn $plugin->errstr; + $subfield_data{marc_value} = { + type => 'text', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + maxlength => $max_length, + }; } - my $plugin = $cgidir . "/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; - do $plugin || die "Plugin Failed: ".$plugin; - my $extended_param; - eval{ - $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop ); - }; - my ( $function_name, $javascript ) = plugin_javascript( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop ); -# my ( $function_name, $javascript,$extended_param ); - - $subfield_data{marc_value} = { - type => 'text2', - id => $subfield_data{id}, - name => $subfield_data{id}, - value => $value, - maxlength => $max_length, - function => $function_name, - index_tag => $index_tag, - javascript => $javascript, - }; - # it's an hidden field } + # it's an hidden field elsif ( $tag eq '' ) { $subfield_data{marc_value} = { type => 'hidden', --- a/cataloguing/addbiblio.pl +++ a/cataloguing/addbiblio.pl @@ -391,21 +391,15 @@ sub create_input { }; # it's a plugin field - } - elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { - - # opening plugin. Just check whether we are on a developer computer on a production one - # (the cgidir differs) - my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder"; - unless ( opendir( DIR, "$cgidir" ) ) { - $cgidir = C4::Context->intranetdir . "/cataloguing/value_builder"; - closedir( DIR ); - } - my $plugin = $cgidir . "/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; - if (do $plugin) { - my $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop ); - my ( $function_name, $javascript ) = plugin_javascript( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop ); - + } elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { + require Koha::FrameworkPlugin; + my $plugin = Koha::FrameworkPlugin->new( { + name => $tagslib->{$tag}->{$subfield}->{'value_builder'}, + }); + my $pars= { dbh => $dbh, record => $rec, tagslib => $tagslib, + id => $subfield_data{id}, tabloop => $tabloop }; + $plugin->build( $pars ); + if( !$plugin->errstr ) { $subfield_data{marc_value} = { type => 'text_complex', id => $subfield_data{id}, @@ -413,13 +407,11 @@ sub create_input { value => $value, size => 67, maxlength => $subfield_data{maxlength}, - function_name => $function_name, - index_tag => $index_tag, - javascript => $javascript, + javascript => $plugin->javascript, + noclick => $plugin->noclick, }; - } else { - warn "Plugin Failed: $plugin"; + warn $plugin->errstr; # supply default input form $subfield_data{marc_value} = { type => 'text', @@ -430,11 +422,10 @@ sub create_input { maxlength => $subfield_data{maxlength}, readonly => 0, }; - } - # it's an hidden field - } - elsif ( $tag eq '' ) { + + # it's an hidden field + } elsif ( $tag eq '' ) { $subfield_data{marc_value} = { type => 'hidden', id => $subfield_data{id}, --- a/cataloguing/additem.pl +++ a/cataloguing/additem.pl @@ -120,7 +120,6 @@ sub generate_subfield_form { $subfield_data{tag} = $tag; $subfield_data{subfield} = $subfieldtag; - $subfield_data{random} = int(rand(1000000)); # why do we need 2 different randoms? $subfield_data{marc_lib} ="{lib}."\">".$subfieldlib->{lib}.""; $subfield_data{mandatory} = $subfieldlib->{mandatory}; $subfield_data{repeatable} = $subfieldlib->{repeatable}; @@ -267,25 +266,24 @@ sub generate_subfield_form { "; } # it's a plugin field - elsif ( $subfieldlib->{value_builder} ) { - # opening plugin - my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $subfieldlib->{'value_builder'}; - if (do $plugin) { - 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 ); - my $change = index($javascript, 'function Change') > -1 ? - "return Change$function_name($subfield_data{random}, '$subfield_data{id}');" : - 'return 1;'; - $subfield_data{marc_value} = qq[ - ... - $javascript]; - } else { - warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = ""; # supply default input form - } + elsif ( $subfieldlib->{value_builder} ) { # plugin + require Koha::FrameworkPlugin; + my $plugin = Koha::FrameworkPlugin->new({ + name => $subfieldlib->{'value_builder'}, + item_style => 1, + }); + my $pars= { dbh => $dbh, record => $temp, tagslib =>$tagslib, + id => $subfield_data{id}, tabloop => $loop_data }; + $plugin->build( $pars ); + if( !$plugin->errstr ) { + #TODO Report 12176 will make this even better ! + my $class= 'buttonDot'. ( $plugin->noclick? ' disabled': '' ); + my $title= $plugin->noclick? 'No popup': 'Tag editor'; + $subfield_data{marc_value} = qq[...\n].$plugin->javascript; + } else { + warn $plugin->errstr; + $subfield_data{marc_value} = ""; # supply default input form + } } elsif ( $tag eq '' ) { # it's an hidden field $subfield_data{marc_value} = qq(); --- a/cataloguing/plugin_launcher.pl +++ a/cataloguing/plugin_launcher.pl @@ -1,6 +1,5 @@ #!/usr/bin/perl - # Copyright 2000-2002 Katipo Communications # # This file is part of Koha. @@ -18,21 +17,13 @@ # with Koha; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -use strict; -#use warnings; FIXME - Bug 2505 +use Modern::Perl; use CGI qw ( -utf8 ); -use C4::Context; -use C4::Output; -my $input = new CGI; -my $plugin_name="cataloguing/value_builder/".$input->param("plugin_name"); +use Koha::FrameworkPlugin; -# opening plugin. Just check whether we are on a developer computer on a production one -# (the cgidir differs) -my $cgidir = C4::Context->intranetdir ."/cgi-bin"; -my $vbdir = "$cgidir/cataloguing/value_builder"; -unless (-r $vbdir and -d $vbdir) { - $cgidir = C4::Context->intranetdir; -} -do $cgidir."/".$plugin_name; -&plugin($input); +my $input = new CGI; +my $plugin= Koha::FrameworkPlugin->new( { + name => $input->param("plugin_name"), +}); +$plugin->launch({ cgi => $input }); --- a/koha-tmpl/intranet-tmpl/prog/en/js/additem.js +++ a/koha-tmpl/intranet-tmpl/prog/en/js/additem.js @@ -161,10 +161,24 @@ function cloneItemBlock(index, unique_item_fields) { }); $("#outeritemblock").append(clone); + BindPluginEvents(data); } }); } +function BindPluginEvents(data) { +// the script tag in data for plugins contains a document ready that binds +// the events for the plugin +// when we append, this code does not get executed anymore; so we do it here + var events= data.match(/BindEventstag_\d+_subfield_._\d+/g); + var i; + for(i=0; i ... [% ELSIF ( mv.type == 'text2' ) %] - - ... + + [% IF mv.noclick %] + ... + [% ELSE %] + ... + [% END %] [% mv.javascript %] [% ELSIF ( mv.type == 'text' ) %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt @@ -621,7 +621,15 @@ function Changefwk(FwkList) { Tag editor [% END %] [% ELSIF ( mv.type == 'text_complex' ) %] - Tag editor[% mv.javascript %] + + + [% IF mv.noclick %] + + [% ELSE %] + Tag editor + [% END %] + + [% mv.javascript %] [% ELSIF ( mv.type == 'hidden' ) %] [% ELSIF ( mv.type == 'textarea' ) %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-edit.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-edit.tt @@ -193,8 +193,12 @@ $(document).ready(function(){ ... [% ELSIF ( mv.type == 'text2' ) %] - - ... + + [% IF mv.noclick %] + ... + [% ELSE %] + ... + [% END %] [% mv.javascript %] [% ELSIF ( mv.type == 'text' ) %] --- a/tools/batchMod.pl +++ a/tools/batchMod.pl @@ -326,8 +326,6 @@ foreach my $tag (sort keys %{$tagslib}) { } $subfield_data{tag} = $tag; $subfield_data{subfield} = $subfield; - $subfield_data{random} = int(rand(1000000)); # why do we need 2 different randoms? - # $subfield_data{marc_lib} = $tagslib->{$tag}->{$subfield}->{lib}; $subfield_data{marc_lib} ="{$tag}->{$subfield}->{lib}."\">".$tagslib->{$tag}->{$subfield}->{lib}.""; $subfield_data{mandatory} = $tagslib->{$tag}->{$subfield}->{mandatory}; $subfield_data{repeatable} = $tagslib->{$tag}->{$subfield}->{repeatable}; @@ -411,26 +409,28 @@ foreach my $tag (sort keys %{$tagslib}) { value => $value, authtypecode => $tagslib->{$tag}->{$subfield}->{authtypecode}, } - # it's a plugin field } - elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { - # opening plugin - my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; - if (do $plugin) { - 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 ); + elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { # plugin + require Koha::FrameworkPlugin; + my $plugin = Koha::FrameworkPlugin->new( { + name => $tagslib->{$tag}->{$subfield}->{'value_builder'}, + item_style => 1, + }); + my $temp; + my $pars= { dbh => $dbh, record => $temp, tagslib => $tagslib, + id => $subfield_data{id}, tabloop => \@loop_data }; + $plugin->build( $pars ); + if( !$plugin->errstr ) { $subfield_data{marc_value} = { type => 'text2', id => $subfield_data{id}, value => $value, - function => $function_name, - random => $subfield_data{random}, - javascript => $javascript, + javascript => $plugin->javascript, + noclick => $plugin->noclick, }; } else { - warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = { # supply default input form + warn $plugin->errstr; + $subfield_data{marc_value} = { # supply default input form type => 'text', id => $subfield_data{id}, value => $value, --