View | Details | Raw Unified | Return to bug 30975
Collapse All | Expand All

(-)a/C4/Items.pm (-1 / +1 lines)
Lines 1520-1526 sub PrepareItemrecordDisplay { Link Here
1520
                        my $tab= $plugin->noclick? '-1': '';
1520
                        my $tab= $plugin->noclick? '-1': '';
1521
                        my $class= $plugin->noclick? ' disabled': '';
1521
                        my $class= $plugin->noclick? ' disabled': '';
1522
                        my $title= $plugin->noclick? 'No popup': 'Tag editor';
1522
                        my $title= $plugin->noclick? 'No popup': 'Tag editor';
1523
                        $subfield_data{marc_value} = qq[<input type="text" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="50" maxlength="$maxlength" value="$defaultvalue" /><a href="#" id="buttonDot_$subfield_data{id}" class="buttonDot $class" title="$title">...</a>\n].$plugin->javascript;
1523
                        $subfield_data{marc_value} = qq[<input type="text" id="$subfield_data{id}" name="field_value" class="input_marceditor framework_plugin" size="50" maxlength="$maxlength" value="$defaultvalue" data-plugin="$plugin->{name}" /><a href="#" id="buttonDot_$subfield_data{id}" class="buttonDot $class" title="$title" data-plugin="$plugin->{name}">...</a>\n].$plugin->javascript;
1524
                    } else {
1524
                    } else {
1525
                        warn $plugin->errstr;
1525
                        warn $plugin->errstr;
1526
                        $subfield_data{marc_value} = qq(<input type="text" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="50" maxlength="$maxlength" value="$defaultvalue" />); # supply default input form
1526
                        $subfield_data{marc_value} = qq(<input type="text" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="50" maxlength="$maxlength" value="$defaultvalue" />); # supply default input form
(-)a/Koha/FrameworkPlugin.pm (-77 / +7 lines)
Lines 297-390 sub _process_javascript { Link Here
297
    $script =~ s/\<script[^>]*\>\s*(\/\/\<!\[CDATA\[)?\s*//s;
297
    $script =~ s/\<script[^>]*\>\s*(\/\/\<!\[CDATA\[)?\s*//s;
298
    $script =~ s/(\/\/\]\]\>\s*)?\<\/script\>//s;
298
    $script =~ s/(\/\/\]\]\>\s*)?\<\/script\>//s;
299
299
300
    my $id = $params->{id}//'';
301
    my $bind = '';
302
    my $clickfound = 0;
300
    my $clickfound = 0;
303
    my @events = qw|click focus blur change mouseover mouseout mousedown
301
    my @events = qw|click focus blur change mousedown mouseup keydown keyup|;
304
        mouseup mousemove keydown keypress keyup|;
305
    foreach my $ev ( @events ) {
302
    foreach my $ev ( @events ) {
306
        my $scan = $ev eq 'click' && $self->{oldschool}? 'clic': $ev;
303
        my $scan = $ev eq 'click' && $self->{oldschool}? 'clic': $ev;
307
        if( $script =~ /function\s+($scan\w+)\s*\(([^\)]*)\)/is ) {
304
        if( $script =~ /function\s+($scan\w+)\s*\(/is ) {
308
            my ( $bl, $sl ) = $self->_add_binding( $1, $2, $ev, $id );
305
            my $function_name = $1;
309
            $script .= $sl;
306
            $script .= sprintf('registerFrameworkPluginHandler("%s", "%s", %s);', $self->name, $ev, $function_name);
310
            $bind .= $bl;
311
            $clickfound = 1 if $ev eq 'click';
307
            $clickfound = 1 if $ev eq 'click';
312
        }
308
        }
313
    }
309
    }
314
    if( !$clickfound ) { # make buttonDot do nothing
315
        my ( $bl ) = $self->_add_binding( 'noclick', '', 'click', $id );
316
        $bind .= $bl;
317
    }
318
    $self->{noclick} = !$clickfound;
310
    $self->{noclick} = !$clickfound;
319
    $self->{javascript}= _merge_script( $id, $script, $bind );
311
    $self->{javascript} = <<JS;
320
}
321
322
sub _add_binding {
323
# adds some jQuery code for event binding:
324
# $bind contains lines for the actual event binding: .click, .focus, etc.
325
# $script contains function definitions (if needed)
326
    my ( $self, $fname, $pars, $ev, $id ) = @_;
327
    my ( $bind, $script );
328
    my $ctl= $ev eq 'click'? 'buttonDot_'.$id: $id;
329
        #click event applies to buttonDot
330
331
    if( $pars =~ /^(e|ev|event)$/i ) { # new style event handler assumed
332
        $bind= qq|    \$("#$ctl").$ev(\{id: '$id'\}, $fname);\n|;
333
        $script='';
334
    } elsif( $fname eq 'noclick' ) { # no click: return false, no scroll
335
        $bind= qq|    \$("#$ctl").$ev(function () { return false; });\n|;
336
        $script='';
337
    } else { # add real event handler calling the function found
338
        $bind=qq|    \$("#$ctl").$ev(\{id: '$id'\}, ${fname}_handler);\n|;
339
        $script = $self->_add_handler( $ev, $fname );
340
    }
341
    return ( $bind, $script );
342
}
343
344
sub _add_handler {
345
# adds a handler with event parameter
346
# event.data.id is passed to the plugin function in parameters
347
# for the click event we always return false to prevent scrolling
348
    my ( $self, $ev, $fname ) = @_;
349
    my $first= $self->_first_item_par( $ev );
350
    my $prefix= $ev eq 'click'? '': 'return ';
351
    my $suffix= $ev eq 'click'? "\n    return false;": '';
352
    return <<HERE;
353
function ${fname}_handler(event) {
354
    $prefix$fname(${first}event.data.id);$suffix
355
}
356
HERE
357
}
358
359
sub _first_item_par {
360
    my ( $self, $event ) = @_;
361
    # needed for backward compatibility
362
    # js event functions in old style item plugins have an extra parameter
363
    # BUT.. not for all events (exceptions provide employment :)
364
    if( $self->{item_style} && $self->{oldschool} &&
365
            $event=~/focus|blur|change/ ) {
366
        return qq/'0',/;
367
    }
368
    return '';
369
}
370
371
sub _merge_script {
372
# Combine script and event bindings, enclosed in script tags.
373
# The BindEvents function is added to easily repeat event binding;
374
# this is used in additem.js for dynamically created item blocks.
375
    my ( $id, $script, $bind ) = @_;
376
    chomp ($script, $bind);
377
    return <<HERE;
378
<script>
312
<script>
313
\$(document).ready(function () {
379
$script
314
$script
380
function BindEvents$id() {
381
$bind
382
}
383
\$(document).ready(function() {
384
    BindEvents$id();
385
});
315
});
386
</script>
316
</script>
387
HERE
317
JS
388
}
318
}
389
319
390
=head1 AUTHOR
320
=head1 AUTHOR
(-)a/Koha/UI/Form/Builder/Item.pm (+1 lines)
Lines 336-341 sub generate_subfield_form { Link Here
336
                class      => $class,
336
                class      => $class,
337
                nopopup    => $plugin->noclick,
337
                nopopup    => $plugin->noclick,
338
                javascript => $plugin->javascript,
338
                javascript => $plugin->javascript,
339
                plugin     => $plugin->name,
339
            };
340
            };
340
        }
341
        }
341
        else {
342
        else {
(-)a/authorities/authorities.pl (+1 lines)
Lines 199-204 sub create_input { Link Here
199
                maxlength => $max_length,
199
                maxlength => $max_length,
200
                javascript => $plugin->javascript,
200
                javascript => $plugin->javascript,
201
                noclick    => $plugin->noclick,
201
                noclick    => $plugin->noclick,
202
                plugin     => $plugin->name,
202
            };
203
            };
203
        } else { # warn and supply default field
204
        } else { # warn and supply default field
204
            warn $plugin->errstr;
205
            warn $plugin->errstr;
(-)a/cataloguing/value_builder/EXAMPLE.pl (-22 / +4 lines)
Lines 65-101 my $builder= sub { Link Here
65
<script>
65
<script>
66
function Focus$id(event) {
66
function Focus$id(event) {
67
    if( \$('#'+event.data.id).val()=='' ) {
67
    if( \$('#'+event.data.id).val()=='' ) {
68
        \$('#'+event.data.id).val('EXAMPLE:');
68
        \$('#'+event.data.id).val('Focus');
69
    }
69
    }
70
}
70
}
71
71
72
function MouseOver$id(event) {
72
function Blur$id(event) {
73
    return Focus$id(event);
73
    if( \$('#'+event.data.id).val()=='' ) {
74
    /* just redirecting it to Focus for the same effect */
74
        \$('#'+event.data.id).val('Blur');
75
}
76
77
function KeyPress$id(event) {
78
    if( event.which == 64 ) { /* at character */
79
        var f= \$('#'+event.data.id).val();
80
        \$('#'+event.data.id).val( f + 'AT' );
81
        return false; /* prevents getting the @ character back too */
82
    }
83
}
84
85
function Change$id(event) {
86
    var colors= [ 'rgb(0, 0, 255)', 'rgb(0, 128, 0)', 'rgb(255, 0, 0)' ];
87
    var curcol= \$('#'+event.data.id).css('color');
88
    var i= Math.floor( Math.random() * 3 );
89
    if( colors[i]==curcol ) {
90
        i= (i + 1)%3;
91
    }
75
    }
92
    var f= \$('#'+event.data.id).css('color',colors[i]);
93
}
76
}
94
77
95
function Click$id(event) {
78
function Click$id(event) {
96
    var fieldvalue=\$('#'+event.data.id).val();
79
    var fieldvalue=\$('#'+event.data.id).val();
97
    window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=EXAMPLE.pl&index=\"+event.data.id+\"&result=\"+fieldvalue,\"tag_editor\",'width=700,height=700,toolbar=false,scrollbars=yes');
80
    window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=EXAMPLE.pl&index=\"+event.data.id+\"&result=\"+fieldvalue,\"tag_editor\",'width=700,height=700,toolbar=false,scrollbars=yes');
98
    return false; /* prevents scrolling */
99
}
81
}
100
</script>|;
82
</script>|;
101
};
83
};
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers.inc (-3 / +3 lines)
Lines 144-154 Link Here
144
                        [% IF mv.readonly %]
144
                        [% IF mv.readonly %]
145
                            <input type="text" id="[%- mv.id | html -%]" name="[% kohafield | html %]" class="input_marceditor [% kohafield | html %]" maxlength="[%- mv.maxlength | html -%]" value="[%- mv.value | html -%]" readonly="readonly" />
145
                            <input type="text" id="[%- mv.id | html -%]" name="[% kohafield | html %]" class="input_marceditor [% kohafield | html %]" maxlength="[%- mv.maxlength | html -%]" value="[%- mv.value | html -%]" readonly="readonly" />
146
                        [% ELSE %]
146
                        [% ELSE %]
147
                            <input type="text" id="[%- mv.id | html -%]" name="[% kohafield | html %]" class="input_marceditor [% kohafield | html %]" maxlength="[%- mv.maxlength | html -%]" value="[%- mv.value | html -%]" />
147
                            <input type="text" id="[%- mv.id | html -%]" name="[% kohafield | html %]" class="input_marceditor framework_plugin [% kohafield | html %]" maxlength="[%- mv.maxlength | html -%]" value="[%- mv.value | html -%]" data-plugin="[% mv.plugin | html %]" />
148
                            [% IF ( mv.nopopup ) %]
148
                            [% IF ( mv.nopopup ) %]
149
                                <a href="#" id="buttonDot_[%- mv.id | html -%]" class="[%- mv.class | html -%]" title="No  popup">...</a>
149
                                <a href="#" id="buttonDot_[%- mv.id | html -%]" class="[%- mv.class | html -%]" title="No  popup" data-plugin="[% mv.plugin | html %]">...</a>
150
                            [% ELSE  %]
150
                            [% ELSE  %]
151
                                <a href="#" id="buttonDot_[%- mv.id | html -%]" class="[%- mv.class | html -%]" title="Tag editor">...</a>
151
                                <a href="#" id="buttonDot_[%- mv.id | html -%]" class="[%- mv.class | html -%]" title="Tag editor" data-plugin="[% mv.plugin | html %]">...</a>
152
                            [% END %]
152
                            [% END %]
153
                            [% UNLESS no_plugin %][%# FIXME - from batchMod-edit, jQuery is included at the end of the template and cataloguing plugins are not working in this situation %]
153
                            [% UNLESS no_plugin %][%# FIXME - from batchMod-edit, jQuery is included at the end of the template and cataloguing plugins are not working in this situation %]
154
                                [%- mv.javascript | $raw -%]
154
                                [%- mv.javascript | $raw -%]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt (-1 / +1 lines)
Lines 528-534 Link Here
528
              <div class="dialog message">The autoBarcode system preference is set to [% Koha.Preference('autoBarcode') | html %] and items with blank barcodes will have barcodes generated upon save to database</div>
528
              <div class="dialog message">The autoBarcode system preference is set to [% Koha.Preference('autoBarcode') | html %] and items with blank barcodes will have barcodes generated upon save to database</div>
529
          [% END %]
529
          [% END %]
530
530
531
          <div id="outeritemblock"></div>
531
          <div id="outeritemblock" class="marc_editor"></div>
532
532
533
      </fieldset>
533
      </fieldset>
534
      [% END %][%# | html UNLESS subscriptionid %]
534
      [% END %][%# | html UNLESS subscriptionid %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt (-1 / +1 lines)
Lines 242-248 Link Here
242
                                                used
242
                                                used
243
                                            </p>
243
                                            </p>
244
                                        [% END %]
244
                                        [% END %]
245
                                        <div id="outeritemblock"></div>
245
                                        <div id="outeritemblock" class="marc_editor"></div>
246
                                    </div>
246
                                    </div>
247
                                </div>
247
                                </div>
248
                                <div id="acq-create-ordering">
248
                                <div id="acq-create-ordering">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/authorities.tt (-2 / +2 lines)
Lines 427-433 Link Here
427
                    </div>
427
                    </div>
428
                [% END # /IF duplicateauthid %]
428
                [% END # /IF duplicateauthid %]
429
429
430
                <form method="post" id="f" name="f" action="/cgi-bin/koha/authorities/authorities.pl">
430
                <form method="post" id="f" name="f" action="/cgi-bin/koha/authorities/authorities.pl" class="marc_editor">
431
                    <input type="hidden" name="op" value="add" />
431
                    <input type="hidden" name="op" value="add" />
432
                    <input type="hidden" name="addfield_field" value="" />
432
                    <input type="hidden" name="addfield_field" value="" />
433
                    <input type="hidden" name="repeat_field" value="" />
433
                    <input type="hidden" name="repeat_field" value="" />
Lines 712-718 Link Here
712
                                                                    [% IF mv.noclick %]
712
                                                                    [% IF mv.noclick %]
713
                                                                        <a href="#" class="buttonDot tag_editor disabled" tabindex="-1" title="No popup">...</a>
713
                                                                        <a href="#" class="buttonDot tag_editor disabled" tabindex="-1" title="No popup">...</a>
714
                                                                    [% ELSE %]
714
                                                                    [% ELSE %]
715
                                                                        <a href="#" id="buttonDot_[% mv.id | html %]" class="buttonDot tag_editor" title="Tag editor">...</a>
715
                                                                        <a href="#" id="buttonDot_[% mv.id | html %]" class="buttonDot tag_editor" title="Tag editor" data-plugin="[% mv.plugin | html %]">...</a>
716
                                                                    [% END %]
716
                                                                    [% END %]
717
                                                                    [% mv.javascript | $raw %]
717
                                                                    [% mv.javascript | $raw %]
718
                                                                [% END #/IF ( mv.type == 'text1' ) %]
718
                                                                [% END #/IF ( mv.type == 'text1' ) %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (-4 / +4 lines)
Lines 839-845 $(document).ready(function(){ Link Here
839
839
840
    <div class="main container-fluid">
840
    <div class="main container-fluid">
841
        <div class="row">
841
        <div class="row">
842
            <div class="col-md-10 col-md-offset-1">
842
            <div class="col-md-10 col-md-offset-1 marc_editor">
843
                [% IF ( INVALID_METADATA ) %]
843
                [% IF ( INVALID_METADATA ) %]
844
                    <div class="page-section bg-danger">
844
                    <div class="page-section bg-danger">
845
                        <h1>Errors found</h1>
845
                        <h1>Errors found</h1>
Lines 1168-1174 $(document).ready(function(){ Link Here
1168
                                                            [% END %]
1168
                                                            [% END %]
1169
1169
1170
                                                        [% ELSIF ( mv.type == 'text_complex' ) %]
1170
                                                        [% ELSIF ( mv.type == 'text_complex' ) %]
1171
                                                            <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 -%]" />
1171
                                                            <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 -%]" data-plugin="[% mv.plugin | html %]" />
1172
                                                            [% mv.javascript | $raw %]
1172
                                                            [% mv.javascript | $raw %]
1173
                                                        [% ELSIF ( mv.type == 'hidden' ) %]
1173
                                                        [% ELSIF ( mv.type == 'hidden' ) %]
1174
                                                            <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 -%]" />
1174
                                                            <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 -%]" />
Lines 1220-1228 $(document).ready(function(){ Link Here
1220
                                                                    <span class="buttonDot tag_editor disabled" tabindex="-1" title="Field autofilled by plugin"></span>
1220
                                                                    <span class="buttonDot tag_editor disabled" tabindex="-1" title="Field autofilled by plugin"></span>
1221
                                                                [% ELSE %]
1221
                                                                [% ELSE %]
1222
                                                                    [% IF mv.plugin == "upload.pl" %]
1222
                                                                    [% IF mv.plugin == "upload.pl" %]
1223
                                                                        <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>
1223
                                                                        <a href="#" id="buttonDot_[% mv.id | html %]" class="tag_editor upload framework_plugin" tabindex="1" data-plugin="[% mv.plugin | html %]"><i class="fa fa-upload" aria-hidden="true"></i> Upload</a>
1224
                                                                    [% ELSE %]
1224
                                                                    [% ELSE %]
1225
                                                                        <a href="#" id="buttonDot_[% mv.id | html %]" class="buttonDot tag_editor framework_plugin" tabindex="1" title="Tag editor">Tag editor</a>
1225
                                                                        <a href="#" id="buttonDot_[% mv.id | html %]" class="buttonDot tag_editor framework_plugin" tabindex="1" title="Tag editor" data-plugin="[% mv.plugin | html %]">Tag editor</a>
1226
                                                                    [% END %]
1226
                                                                    [% END %]
1227
                                                                [% END %]
1227
                                                                [% END %]
1228
                                                            </span>
1228
                                                            </span>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt (-1 / +1 lines)
Lines 174-180 Link Here
174
    </div>
174
    </div>
175
    <div class="col-sm-10">
175
    <div class="col-sm-10">
176
176
177
<div id="cataloguing_additem_newitem" class="item_edit_form page-section">
177
<div id="cataloguing_additem_newitem" class="item_edit_form page-section marc_editor">
178
    <form id="f" method="post" action="/cgi-bin/koha/cataloguing/additem.pl?biblionumber=[% biblio.biblionumber | html %]" name="f">
178
    <form id="f" method="post" action="/cgi-bin/koha/cataloguing/additem.pl?biblionumber=[% biblio.biblionumber | html %]" name="f">
179
    <input type="hidden" name="op" value="[% op | html %]" />
179
    <input type="hidden" name="op" value="[% op | html %]" />
180
    [% IF (popup) %]
180
    [% IF (popup) %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/additem.js (-14 lines)
Lines 227-250 function cloneItemBlock(index, unique_item_fields, callback) { Link Here
227
                var cloneIndex = "itemblock"+random;
227
                var cloneIndex = "itemblock"+random;
228
                callback(cloneIndex);
228
                callback(cloneIndex);
229
            }
229
            }
230
            BindPluginEvents(data);
231
        }
230
        }
232
    });
231
    });
233
}
232
}
234
233
235
function BindPluginEvents(data) {
236
// the script tag in data for plugins contains a document ready that binds
237
// the events for the plugin
238
// when we append, this code does not get executed anymore; so we do it here
239
    var events= data.match(/BindEventstag_\d+_subfield_._\d+/g);
240
    if ( events == null ) return;
241
    for(var i=0; i<events.length; i++) {
242
        window[events[i]]();
243
        if( i<events.length-1 && events[i]==events[i+1] ) { i++; }
244
        // normally we find the function name twice
245
    }
246
}
247
248
function clearItemBlock(node) {
234
function clearItemBlock(node) {
249
    var index = $(node).closest("div").attr('id');
235
    var index = $(node).closest("div").attr('id');
250
    var block = $("#"+index);
236
    var block = $("#"+index);
(-)a/koha-tmpl/intranet-tmpl/prog/js/cataloging.js (-56 / +46 lines)
Lines 1-5 Link Here
1
/* global __ */
1
/* global __ */
2
/* exported openAuth ExpandField CloneField CloneSubfield UnCloneField CloneItemSubfield CheckMandatorySubfields */
2
/* exported openAuth ExpandField CloneField CloneSubfield UnCloneField CloneItemSubfield CheckMandatorySubfields registerFrameworkPluginHandler */
3
3
4
/*
4
/*
5
 * Unified file for catalogue edition
5
 * Unified file for catalogue edition
Lines 185-192 function CloneField(index, hideMarc, advancedMARCEditor) { Link Here
185
185
186
            var inputs   = divs[i].getElementsByTagName('input');
186
            var inputs   = divs[i].getElementsByTagName('input');
187
            var id_input = "";
187
            var id_input = "";
188
            var olddiv;
189
            var oldcontrol;
190
188
191
            for( j = 0 ; j < inputs.length ; j++ ) {
189
            for( j = 0 ; j < inputs.length ; j++ ) {
192
                if(inputs[j].getAttribute("id") && inputs[j].getAttribute("id").match(/^tag_/) ){
190
                if(inputs[j].getAttribute("id") && inputs[j].getAttribute("id").match(/^tag_/) ){
Lines 227-237 function CloneField(index, hideMarc, advancedMARCEditor) { Link Here
227
                        }
225
                        }
228
                    }
226
                    }
229
                }
227
                }
230
                if( $(inputs[1]).hasClass('framework_plugin') ) {
231
                    olddiv= original.getElementsByTagName('li')[i];
232
                    oldcontrol= olddiv.getElementsByTagName('input')[1];
233
                    AddEventHandlers( oldcontrol,inputs[1],id_input );
234
                }
235
            }
228
            }
236
            // when cloning a subfield, re set its label too.
229
            // when cloning a subfield, re set its label too.
237
            try {
230
            try {
Lines 269-290 function CloneField(index, hideMarc, advancedMARCEditor) { Link Here
269
                if(!CloneButtonPlus){ // it s impossible to have  + ... (buttonDot AND buttonPlus)
262
                if(!CloneButtonPlus){ // it s impossible to have  + ... (buttonDot AND buttonPlus)
270
                    buttonDot = spans[0];
263
                    buttonDot = spans[0];
271
                    if(buttonDot){
264
                    if(buttonDot){
272
                        // 2 possibilities :
265
                        try {
273
                        try{
266
                            // do not copy the script section.
274
                            if( $(buttonDot).hasClass('framework_plugin') ) {
267
                            var script = spans[0].getElementsByTagName('script')[0];
275
                                olddiv= original.getElementsByTagName('li')[i];
268
                            spans[0].removeChild(script);
276
                                oldcontrol= olddiv.getElementsByTagName('a')[0];
269
                        } catch(e) {
277
                                AddEventHandlers(oldcontrol,buttonDot,id_input);
270
                            // do nothing if there is no script
278
                            }
279
                            try {
280
                                // do not copy the script section.
281
                                var script = spans[0].getElementsByTagName('script')[0];
282
                                spans[0].removeChild(script);
283
                            } catch(e) {
284
                                // do nothing if there is no script
285
                            }
286
                        } catch(e){
287
                            //
288
                        }
271
                        }
289
                    }
272
                    }
290
                }
273
                }
Lines 346-352 function CloneSubfield(index, advancedMARCEditor){ Link Here
346
    var selects    = clone.getElementsByTagName('select');
329
    var selects    = clone.getElementsByTagName('select');
347
    var textareas  = clone.getElementsByTagName('textarea');
330
    var textareas  = clone.getElementsByTagName('textarea');
348
    var linkid;
331
    var linkid;
349
    var oldcontrol;
350
332
351
    // input
333
    // input
352
    var id_input = "";
334
    var id_input = "";
Lines 360-371 function CloneSubfield(index, advancedMARCEditor){ Link Here
360
        linkid = id_input;
342
        linkid = id_input;
361
    }
343
    }
362
344
363
    // Plugin input
364
    if( $(inputs[1]).hasClass('framework_plugin') ) {
365
        oldcontrol= original.getElementsByTagName('input')[1];
366
        AddEventHandlers( oldcontrol, inputs[1], linkid );
367
    }
368
369
    // select
345
    // select
370
    for(i=0,len=selects.length; i<len ; i++ ){
346
    for(i=0,len=selects.length; i<len ; i++ ){
371
        id_input = selects[i].getAttribute('id')+new_key;
347
        id_input = selects[i].getAttribute('id')+new_key;
Lines 385-397 function CloneSubfield(index, advancedMARCEditor){ Link Here
385
        linkid = id_input;
361
        linkid = id_input;
386
    }
362
    }
387
363
388
    // Handle click event on buttonDot for plugin
389
    var links  = clone.getElementsByTagName('a');
390
    if( $(links[0]).hasClass('framework_plugin') ) {
391
        oldcontrol= original.getElementsByTagName('a')[0];
392
        AddEventHandlers( oldcontrol, links[0], linkid );
393
    }
394
395
    if(advancedMARCEditor == '0') {
364
    if(advancedMARCEditor == '0') {
396
        // when cloning a subfield, reset its label too.
365
        // when cloning a subfield, reset its label too.
397
        var label = clone.getElementsByTagName('label')[0];
366
        var label = clone.getElementsByTagName('label')[0];
Lines 430-452 function CloneSubfield(index, advancedMARCEditor){ Link Here
430
    clone.querySelectorAll('input.input_marceditor').value = "";
399
    clone.querySelectorAll('input.input_marceditor').value = "";
431
}
400
}
432
401
433
function AddEventHandlers (oldcontrol, newcontrol, newinputid ) {
434
// This function is a helper for CloneField and CloneSubfield.
435
// It adds the event handlers from oldcontrol to newcontrol.
436
// newinputid is the id attribute of the cloned controlling input field
437
// Note: This code depends on the jQuery data for events; this structure
438
// is moved to _data as of jQuery 1.8.
439
    var ev = $._data(oldcontrol, "events");
440
    if(typeof ev != 'undefined') {
441
        $.each(ev, function(prop,val) {
442
            $.each(val, function(prop2,val2) {
443
                $(newcontrol).off( val2.type );
444
                $(newcontrol).on( val2.type, {id: newinputid}, val2.handler );
445
            });
446
        });
447
    }
448
}
449
450
/**
402
/**
451
 * This function removes or clears unwanted subfields
403
 * This function removes or clears unwanted subfields
452
 */
404
 */
Lines 642-644 $(document).ready(function() { Link Here
642
    });
594
    });
643
595
644
});
596
});
645
- 
597
598
Koha.frameworkPlugins ||= {};
599
function registerFrameworkPluginHandler(name, eventType, handler) {
600
    // 'focus' and 'blur' events do not bubble,
601
    // so we have to use 'focusin' and 'focusout' instead
602
    if (eventType === 'focus') eventType = 'focusin';
603
    else if (eventType === 'blur') eventType = 'focusout';
604
605
    Koha.frameworkPlugins[name] ||= {};
606
    Koha.frameworkPlugins[name][eventType] ||= handler;
607
}
608
$(document).ready(function() {
609
    function callClickPluginEventHandler (event) {
610
        event.preventDefault();
611
        callPluginEventHandler.call(this, event);
612
    }
613
614
    function callPluginEventHandler (event) {
615
        event.stopPropagation();
616
617
        const plugin = event.target.getAttribute('data-plugin');
618
        if (plugin && plugin in Koha.frameworkPlugins && event.type in Koha.frameworkPlugins[plugin]) {
619
            event.data = {};
620
            if (event.target.classList.contains('buttonDot')) {
621
                event.data.id = event.target.closest('.subfield_line').querySelector('input.input_marceditor').id;
622
            } else {
623
                event.data.id = event.target.id;
624
            }
625
626
            Koha.frameworkPlugins[plugin][event.type].call(this, event);
627
        }
628
    }
629
630
    // We use delegated event handlers here so that dynamically added elements
631
    // (like when cloning a field or a subfield) respond to these events
632
    // without having to re-attach events manually
633
    $('.marc_editor').on('click', '.buttonDot', callClickPluginEventHandler);
634
    $('.marc_editor').on('focusin focusout change mousedown mouseup keydown keyup', 'input.input_marceditor.framework_plugin', callPluginEventHandler);
635
});

Return to bug 30975