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

(-)a/Koha/SearchField.pm (+12 lines)
Lines 68-73 sub search_marc_maps { Link Here
68
    return $marc_map_fields;
68
    return $marc_map_fields;
69
}
69
}
70
70
71
=head3 is_mapped
72
73
my $is_mapped = $search_field->is_mapped
74
75
=cut
76
77
sub is_mapped {
78
    my ( $self ) = @_;
79
80
    return $self->search_marc_maps()->count ? 1 : 0;
81
}
82
71
=head3 is_mapped_biblios
83
=head3 is_mapped_biblios
72
84
73
my $is_mapped_biblios = $search_field->is_mapped_biblios
85
my $is_mapped_biblios = $search_field->is_mapped_biblios
(-)a/admin/searchengine/elasticsearch/mappings.pl (-3 / +8 lines)
Lines 109-114 if ( $op eq 'cud-edit' ) { Link Here
109
109
110
    eval {
110
    eval {
111
111
112
        Koha::SearchFields->search()->delete;
113
112
        for my $i ( 0 .. scalar(@field_name) - 1 ) {
114
        for my $i ( 0 .. scalar(@field_name) - 1 ) {
113
            my $field_name = $field_name[$i];
115
            my $field_name = $field_name[$i];
114
            my $field_label = $field_label[$i];
116
            my $field_label = $field_label[$i];
Lines 117-125 if ( $op eq 'cud-edit' ) { Link Here
117
            my $field_staff_client = $field_staff_client[$i];
119
            my $field_staff_client = $field_staff_client[$i];
118
            my $field_opac = $field_opac[$i];
120
            my $field_opac = $field_opac[$i];
119
121
120
            my $search_field = Koha::SearchFields->find( { name => $field_name }, { key => 'name' } );
122
            my $search_field = Koha::SearchFields->find_or_create({
121
            $search_field->label($field_label);
123
                name => $field_name,
122
            $search_field->type($field_type);
124
                label => $field_label,
125
                type => $field_type,
126
            });
123
127
124
            if (!length($field_weight)) {
128
            if (!length($field_weight)) {
125
                $search_field->weight(undef);
129
                $search_field->weight(undef);
Lines 285-290 my @all_search_fields; Link Here
285
while ( my $search_field = $search_fields->next ) {
289
while ( my $search_field = $search_fields->next ) {
286
    my $search_field_unblessed = $search_field->unblessed;
290
    my $search_field_unblessed = $search_field->unblessed;
287
    $search_field_unblessed->{mapped_biblios} = 1 if $search_field->is_mapped_biblios;
291
    $search_field_unblessed->{mapped_biblios} = 1 if $search_field->is_mapped_biblios;
292
    $search_field_unblessed->{is_mapped} = $search_field->is_mapped;
288
    $search_field_unblessed->{aliases} = $search_fields_aliases->{$search_field_unblessed->{name}};
293
    $search_field_unblessed->{aliases} = $search_fields_aliases->{$search_field_unblessed->{name}};
289
    push @all_search_fields, $search_field_unblessed;
294
    push @all_search_fields, $search_field_unblessed;
290
}
295
}
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/searchengine/elasticsearch/mappings.tt (-1 / +50 lines)
Lines 133-139 a.add, a.delete { Link Here
133
133
134
            [% WRAPPER tab_panels %]
134
            [% WRAPPER tab_panels %]
135
                [% WRAPPER tab_panel tabname="search_fields" bt_active= 1 %]
135
                [% WRAPPER tab_panel tabname="search_fields" bt_active= 1 %]
136
                    <table class="search_fields" id="search_fields_table">
136
                    <table class="search_fields" id="search_fields_table" data-index_name="search_fields">
137
                        <thead>
137
                        <thead>
138
                            <tr>
138
                            <tr>
139
                                <th>Name</th>
139
                                <th>Name</th>
Lines 142-152 a.add, a.delete { Link Here
142
                                <th>Type</th>
142
                                <th>Type</th>
143
                                <th>Weight</th>
143
                                <th>Weight</th>
144
                                <th colspan="2">Searchable</th>
144
                                <th colspan="2">Searchable</th>
145
                                <th>&nbsp;</th>
145
                            </tr>
146
                            </tr>
146
                            <tr>
147
                            <tr>
147
                                <th colspan="5" class="NoSort">&nbsp;</th>
148
                                <th colspan="5" class="NoSort">&nbsp;</th>
148
                                <th class="NoSort">Staff interface</th>
149
                                <th class="NoSort">Staff interface</th>
149
                                <th class="NoSort">OPAC</th>
150
                                <th class="NoSort">OPAC</th>
151
                                <th>&nbsp;</th>
150
                            </tr>
152
                            </tr>
151
                        </thead>
153
                        </thead>
152
                        <tbody>
154
                        <tbody>
Lines 253-261 a.add, a.delete { Link Here
253
                                            [% END %]
255
                                            [% END %]
254
                                        </select>
256
                                        </select>
255
                                    </td>
257
                                    </td>
258
                                    <td>
259
                                        [% IF search_field.is_mapped %]
260
                                            <a class="btn btn-default btn-xs disabled delete" style="cursor: pointer;"><i class="fa fa-trash"></i> Delete</a>
261
                                        [% ELSE %]
262
                                            <a class="btn btn-default btn-xs delete" style="cursor: pointer;"><i class="fa fa-trash"></i> Delete</a>
263
                                        [% END %]
264
                                    </td>
256
                                </tr>
265
                                </tr>
257
                            [% END %]
266
                            [% END %]
258
                        </tbody>
267
                        </tbody>
268
                        <tfoot>
269
                            <tr>
270
                                <td>
271
                                    <input type="text" data-id="search_field_name"/>
272
                                </td>
273
                                <td></td>
274
                                <td>
275
                                    <input type="text" data-id="search_field_label"/>
276
                                </td>
277
                                <td>
278
                                    <select data-id="search_field_type">
279
                                        <option value=""></option>
280
                                        <option value="string">String</option>
281
                                        <option value="date">Date</option>
282
                                        <option value="year">Year</option>
283
                                        <option value="number">Number</option>
284
                                        <option value="boolean">Boolean</option>
285
                                        <option value="sum">Sum</option>
286
                                        <option value="isbn">ISBN</option>
287
                                        <option value="stdno">Std. Number</option>
288
                                    </select>
289
                                </td>
290
                                <td>
291
                                    <input type="text" data-id="search_field_weight" value="">
292
                                </td>
293
                                <td>
294
                                    <select data-id="search_field_staff_client">
295
                                        <option value="1">Yes</option>
296
                                        <option value="0">No</option>
297
                                    </select>
298
                                </td>
299
                                <td>
300
                                    <select data-id="search_field_opac">
301
                                        <option value="1">Yes</option>
302
                                        <option value="0">No</option>
303
                                    </select>
304
                                </td>
305
                                <td><a class="btn btn-default btn-xs add-search-field"><i class="fa fa-plus"></i> Add</a></td>
306
                            </tr>
307
                        </tfoot>
259
                    </table>
308
                    </table>
260
                [% END %]
309
                [% END %]
261
                [% FOREACH index IN indexes %]
310
                [% FOREACH index IN indexes %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/elasticsearch-mappings.js (-1 / +49 lines)
Lines 14-19 function clone_line(line) { Link Here
14
    $(new_line).find("select").each(function () {
14
    $(new_line).find("select").each(function () {
15
        var attr = $(this).attr('name');
15
        var attr = $(this).attr('name');
16
        var val = $(line).find('[data-id="' + attr + '"]').val();
16
        var val = $(line).find('[data-id="' + attr + '"]').val();
17
        $(this).find('option').removeAttr('selected');
17
        $(this).find('option[value="' + val + '"]').attr("selected", "selected");
18
        $(this).find('option[value="' + val + '"]').attr("selected", "selected");
18
    });
19
    });
19
    return new_line;
20
    return new_line;
Lines 46-52 $(document).ready(function () { Link Here
46
        tableInit( oldtabid, newtabid );
47
        tableInit( oldtabid, newtabid );
47
    });
48
    });
48
49
49
    $('.delete').click(function () {
50
    $(document).on('click', '.delete', function() {
50
        if ($(this).hasClass('mandatory') && $(".mandatory[data-field_name=" + $(this).attr('data-field_name') + "]").length < 2) {
51
        if ($(this).hasClass('mandatory') && $(".mandatory[data-field_name=" + $(this).attr('data-field_name') + "]").length < 2) {
51
            alert( __("This field is mandatory and must have at least one mapping") );
52
            alert( __("This field is mandatory and must have at least one mapping") );
52
            return;
53
            return;
Lines 54-59 $(document).ready(function () { Link Here
54
            var table = $(this).closest('table');
55
            var table = $(this).closest('table');
55
            let dt = $(table).DataTable();
56
            let dt = $(table).DataTable();
56
            dt.row( $(this).closest('tr') ).remove().draw();
57
            dt.row( $(this).closest('tr') ).remove().draw();
58
            $(this).parents('tr').remove();
59
            var line = $(this).closest("tr");
60
61
            var name;
62
            // We clicked delete button on search fields tab.
63
            if (name = $(line).find('input[name="search_field_name"]').val()) {
64
                // Prevent user from using a search field for a mapping
65
                // after removing it without saving.
66
                $('select[data-id="mapping_search_field_name"]').each(function( index, element) {
67
                    $(element).find('option[value="' + name + '"]').remove();
68
                });
69
            }
70
71
            var search_field_name = $(line).find('input[name="mapping_search_field_name"]').val();
72
            var mappings = $('input[name="mapping_search_field_name"][type="hidden"][value="' + search_field_name + '"]');
73
            if (mappings.length == 0) {
74
                var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
75
                $(search_field_line).find('a.btn-default').removeClass('disabled');
76
            }
57
        }
77
        }
58
    });
78
    });
59
79
Lines 65-74 $(document).ready(function () { Link Here
65
        var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
85
        var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
66
        if (marc_field.length > 0) {
86
        if (marc_field.length > 0) {
67
            var new_line = clone_line(line);
87
            var new_line = clone_line(line);
88
            var search_field_name = $(line).find('select[data-id="mapping_search_field_name"] option:selected').text();
68
            new_line.appendTo($('table[data-index_name="' + index_name + '"]>tbody'));
89
            new_line.appendTo($('table[data-index_name="' + index_name + '"]>tbody'));
69
            let dt = $('#' + table_id).DataTable();
90
            let dt = $('#' + table_id).DataTable();
70
            dt.row.add(new_line).draw();
91
            dt.row.add(new_line).draw();
71
92
93
            var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
94
            $(search_field_line).find('a.btn-default').addClass('disabled');
95
96
            clean_line(line);
97
72
            $(table).on( 'click', '.delete', function () {
98
            $(table).on( 'click', '.delete', function () {
73
                var table = $(this).closest('table');
99
                var table = $(this).closest('table');
74
                let dt = $(table).DataTable();
100
                let dt = $(table).DataTable();
Lines 99-102 $(document).ready(function () { Link Here
99
        });
125
        });
100
        return true;
126
        return true;
101
    });
127
    });
128
129
    $('.add-search-field').click(function() {
130
        var table = $(this).closest('table');
131
        var line = $(this).closest("tr");
132
        var name = $(line).find('input[data-id="search_field_name"]').val();
133
        let already_exist = 0;
134
135
        if ( $('input[name="search_field_name"][value="' + name + '"]').val() ) {
136
            already_exist = 1;
137
        }
138
139
        if (already_exist) {
140
            alert("SearchField "+ name + " already exist");
141
        } else {
142
            var label = $(line).find('input[data-id="search_field_label"]').val();
143
            if ( name.length > 0 && label.length > 0 ) {
144
                var new_line = clone_line( line );
145
                new_line.appendTo(table.find('tbody'));
146
                clean_line(line);
147
            }
148
        }
149
    });
102
});
150
});
(-)a/t/db_dependent/Koha/SearchField.t (-3 / +29 lines)
Lines 19-28 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 10;
22
use Test::More tests => 12;
23
23
24
use Koha::Database;
24
use Koha::Database;
25
use Koha::SearchFields;
25
use Koha::SearchFields;
26
use Koha::SearchMarcMaps;
26
27
27
use t::lib::Mocks;
28
use t::lib::Mocks;
28
use t::lib::TestBuilder;
29
use t::lib::TestBuilder;
Lines 38-43 my $sf = $builder->build({ Link Here
38
    source => 'SearchField',
39
    source => 'SearchField',
39
});
40
});
40
41
42
my $search_field = Koha::SearchFields->find($sf->{id});
43
ok(!$search_field->is_mapped, 'Search field 1 is not mapped');
44
45
my $auth_smm = $builder->build({
46
    source => 'SearchMarcMap',
47
    value => {
48
        index_name  => 'authorities',
49
        marc_type   => 'marc21',
50
        marc_field  => '200abde'
51
    }
52
});
53
54
my $auth_smtf = $builder->build({
55
    source => 'SearchMarcToField',
56
    value => {
57
        search_marc_map_id  => $auth_smm->{id},
58
        search_field_id     => $sf->{id}
59
    }
60
});
61
62
$search_field = Koha::SearchFields->find($sf->{id});
63
ok($search_field->is_mapped, 'Search field 1 is mapped');
64
65
Koha::SearchMarcMaps->search({})->delete;
66
$schema->resultset('SearchMarcToField')->search({})->delete;
67
41
my $smm = $builder->build({
68
my $smm = $builder->build({
42
    source => 'SearchMarcMap',
69
    source => 'SearchMarcMap',
43
    value => {
70
    value => {
Lines 72-78 my $smtf2 = $builder->build({ Link Here
72
    }
99
    }
73
});
100
});
74
101
75
my $search_field = Koha::SearchFields->find($sf->{id});
102
$search_field = Koha::SearchFields->find($sf->{id});
76
my $marc_maps = $search_field->search_marc_maps;
103
my $marc_maps = $search_field->search_marc_maps;
77
my $marc_map = $marc_maps->next;
104
my $marc_map = $marc_maps->next;
78
is($marc_maps->count, 1, 'search_marc_maps should return 1 marc map');
105
is($marc_maps->count, 1, 'search_marc_maps should return 1 marc map');
79
- 

Return to bug 20388