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

(-)a/Koha/SearchField.pm (+12 lines)
Lines 69-74 sub search_marc_maps { Link Here
69
    return $marc_map_fields;
69
    return $marc_map_fields;
70
}
70
}
71
71
72
=head3 is_mapped
73
74
my $is_mapped = $search_field->is_mapped
75
76
=cut
77
78
sub is_mapped {
79
    my ( $self ) = @_;
80
81
    return $self->search_marc_maps()->count ? 1 : 0;
82
}
83
72
=head3 is_mapped_biblios
84
=head3 is_mapped_biblios
73
85
74
my $is_mapped_biblios = $search_field->is_mapped_biblios
86
my $is_mapped_biblios = $search_field->is_mapped_biblios
(-)a/admin/searchengine/elasticsearch/mappings.pl (-3 / +8 lines)
Lines 109-114 if ( $op eq '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 '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 274-279 my @all_search_fields; Link Here
274
while ( my $search_field = $search_fields->next ) {
278
while ( my $search_field = $search_fields->next ) {
275
    my $search_field_unblessed = $search_field->unblessed;
279
    my $search_field_unblessed = $search_field->unblessed;
276
    $search_field_unblessed->{mapped_biblios} = 1 if $search_field->is_mapped_biblios;
280
    $search_field_unblessed->{mapped_biblios} = 1 if $search_field->is_mapped_biblios;
281
    $search_field_unblessed->{is_mapped} = $search_field->is_mapped;
277
    $search_field_unblessed->{aliases} = $search_fields_aliases->{$search_field_unblessed->{name}};
282
    $search_field_unblessed->{aliases} = $search_fields_aliases->{$search_field_unblessed->{name}};
278
    push @all_search_fields, $search_field_unblessed;
283
    push @all_search_fields, $search_field_unblessed;
279
}
284
}
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/searchengine/elasticsearch/mappings.tt (-1 / +50 lines)
Lines 126-132 a.add, a.delete { Link Here
126
                [% END %]
126
                [% END %]
127
            </ul>
127
            </ul>
128
            <div id="search_fields" class="ui-tabs-panel">
128
            <div id="search_fields" class="ui-tabs-panel">
129
              <table class="search_fields" id="search_fields_table">
129
              <table class="search_fields" id="search_fields_table" data-index_name="search_fields">
130
                <thead>
130
                <thead>
131
                  <tr>
131
                  <tr>
132
                    <th>Name</th>
132
                    <th>Name</th>
Lines 135-145 a.add, a.delete { Link Here
135
                    <th>Type</th>
135
                    <th>Type</th>
136
                    <th>Weight</th>
136
                    <th>Weight</th>
137
                    <th colspan="2">Searchable</th>
137
                    <th colspan="2">Searchable</th>
138
                    <th>&nbsp;</th>
138
                  </tr>
139
                  </tr>
139
                  <tr>
140
                  <tr>
140
                    <th colspan="5" class="NoSort">&nbsp;</th>
141
                    <th colspan="5" class="NoSort">&nbsp;</th>
141
                    <th class="NoSort">Staff interface</th>
142
                    <th class="NoSort">Staff interface</th>
142
                    <th class="NoSort">OPAC</th>
143
                    <th class="NoSort">OPAC</th>
144
                    <th>&nbsp;</th>
143
                  </tr>
145
                  </tr>
144
                </thead>
146
                </thead>
145
                <tbody>
147
                <tbody>
Lines 241-249 a.add, a.delete { Link Here
241
                          [% END %]
243
                          [% END %]
242
                        </select>
244
                        </select>
243
                      </td>
245
                      </td>
246
                      <td>
247
                        [% IF search_field.is_mapped %]
248
                          <a class="btn btn-default btn-xs disabled delete" style="cursor: pointer;"><i class="fa fa-trash"></i> Delete</a>
249
                        [% ELSE %]
250
                          <a class="btn btn-default btn-xs delete" style="cursor: pointer;"><i class="fa fa-trash"></i> Delete</a>
251
                        [% END %]
252
                      </td>
244
                    </tr>
253
                    </tr>
245
                  [% END %]
254
                  [% END %]
246
                </tbody>
255
                </tbody>
256
                <tfoot>
257
                  <tr>
258
                    <td>
259
                      <input type="text" data-id="search_field_name"/>
260
                    </td>
261
                    <td></td>
262
                    <td>
263
                      <input type="text" data-id="search_field_label"/>
264
                    </td>
265
                    <td>
266
                      <select data-id="search_field_type">
267
                        <option value=""></option>
268
                        <option value="string">String</option>
269
                        <option value="date">Date</option>
270
                        <option value="year">Year</option>
271
                        <option value="number">Number</option>
272
                        <option value="boolean">Boolean</option>
273
                        <option value="sum">Sum</option>
274
                        <option value="isbn">ISBN</option>
275
                        <option value="stdno">Std. Number</option>
276
                      </select>
277
                    </td>
278
                    <td>
279
                      <input type="text" data-id="search_field_weight" value="">
280
                    </td>
281
                    <td>
282
                      <select data-id="search_field_staff_client">
283
                        <option value="1">Yes</option>
284
                        <option value="0">No</option>
285
                      </select>
286
                    </td>
287
                    <td>
288
                      <select data-id="search_field_opac">
289
                        <option value="1">Yes</option>
290
                        <option value="0">No</option>
291
                      </select>
292
                    </td>
293
                    <td><a class="btn btn-default btn-xs add-search-field"><i class="fa fa-plus"></i> Add</a></td>
294
                  </tr>
295
                </tfoot>
247
              </table>
296
              </table>
248
            </div>
297
            </div>
249
            [% FOREACH index IN indexes %]
298
            [% FOREACH index IN indexes %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/elasticsearch-mappings.js (-4 / +47 lines)
Lines 15-20 function clone_line(line) { Link Here
15
    $(new_line).find("select").each(function () {
15
    $(new_line).find("select").each(function () {
16
        var attr = $(this).attr('name');
16
        var attr = $(this).attr('name');
17
        var val = $(line).find('[data-id="' + attr + '"]').val();
17
        var val = $(line).find('[data-id="' + attr + '"]').val();
18
        $(this).find('option').removeAttr('selected');
18
        $(this).find('option[value="' + val + '"]').attr("selected", "selected");
19
        $(this).find('option[value="' + val + '"]').attr("selected", "selected");
19
    });
20
    });
20
    return new_line;
21
    return new_line;
Lines 48-59 $(document).ready(function () { Link Here
48
        },
49
        },
49
    });
50
    });
50
51
51
    $('.delete').click(function () {
52
    $(document).on('click', '.delete', function() {
52
        if ($(this).hasClass('mandatory') && $(".mandatory[data-field_name=" + $(this).attr('data-field_name') + "]").length < 2) {
53
        if ($(this).hasClass('mandatory') && $(".mandatory[data-field_name=" + $(this).attr('data-field_name') + "]").length < 2) {
53
            alert( __("This field is mandatory and must have at least one mapping") );
54
            alert( __("This field is mandatory and must have at least one mapping") );
54
            return;
55
            return;
55
        } else {
56
        } else {
56
            $(this).parents('tr').remove();
57
            $(this).parents('tr').remove();
58
            var line = $(this).closest("tr");
59
60
            var name;
61
            // We clicked delete button on search fields tab.
62
            if (name = $(line).find('input[name="search_field_name"]').val()) {
63
                // Prevent user from using a search field for a mapping
64
                // after removing it without saving.
65
                $('select[data-id="mapping_search_field_name"]').each(function( index, element) {
66
                    $(element).find('option[value="' + name + '"]').remove();
67
                });
68
            }
69
70
            var search_field_name = $(line).find('input[name="mapping_search_field_name"]').val();
71
            var mappings = $('input[name="mapping_search_field_name"][type="hidden"][value="' + search_field_name + '"]');
72
            if (mappings.length == 0) {
73
                var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
74
                $(search_field_line).find('a.btn-default').removeClass('disabled');
75
            }
57
        }
76
        }
58
    });
77
    });
59
78
Lines 68-77 $(document).ready(function () { Link Here
68
        var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
87
        var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
69
        if (marc_field.length > 0) {
88
        if (marc_field.length > 0) {
70
            var new_line = clone_line(line);
89
            var new_line = clone_line(line);
90
            var search_field_name = $(line).find('select[data-id="mapping_search_field_name"] option:selected').text();
71
            new_line.appendTo($('table[data-index_name="' + index_name + '"]>tbody'));
91
            new_line.appendTo($('table[data-index_name="' + index_name + '"]>tbody'));
72
            $('.delete').click(function () {
92
73
                $(this).parents('tr').remove();
93
            var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
74
            });
94
            $(search_field_line).find('a.btn-default').addClass('disabled');
95
75
            clean_line(line);
96
            clean_line(line);
76
97
77
            $(table).tableDnD({
98
            $(table).tableDnD({
Lines 82-85 $(document).ready(function () { Link Here
82
    $("#facet_biblios > table").tableDnD({
103
    $("#facet_biblios > table").tableDnD({
83
        onDragClass: "dragClass highlighted-row",
104
        onDragClass: "dragClass highlighted-row",
84
    });
105
    });
106
107
    $('.add-search-field').click(function() {
108
        var table = $(this).closest('table');
109
        var line = $(this).closest("tr");
110
        var name = $(line).find('input[data-id="search_field_name"]').val();
111
        let already_exist = 0;
112
113
        if ( $('input[name="search_field_name"][value="' + name + '"]').val() ) {
114
            already_exist = 1;
115
        }
116
117
        if (already_exist) {
118
            alert("SearchField "+ name + " already exist");
119
        } else {
120
            var label = $(line).find('input[data-id="search_field_label"]').val();
121
            if ( name.length > 0 && label.length > 0 ) {
122
                var new_line = clone_line( line );
123
                new_line.appendTo(table.find('tbody'));
124
                clean_line(line);
125
            }
126
        }
127
    });
85
});
128
});
(-)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