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 122-128 a.add, a.delete { Link Here
122
                [% END %]
122
                [% END %]
123
            </ul>
123
            </ul>
124
            <div id="search_fields" class="ui-tabs-panel">
124
            <div id="search_fields" class="ui-tabs-panel">
125
              <table class="search_fields" id="search_fields_table">
125
              <table class="search_fields" id="search_fields_table" data-index_name="search_fields">
126
                <thead>
126
                <thead>
127
                  <tr>
127
                  <tr>
128
                    <th>Name</th>
128
                    <th>Name</th>
Lines 131-141 a.add, a.delete { Link Here
131
                    <th>Type</th>
131
                    <th>Type</th>
132
                    <th>Weight</th>
132
                    <th>Weight</th>
133
                    <th colspan="2">Searchable</th>
133
                    <th colspan="2">Searchable</th>
134
                    <th>&nbsp;</th>
134
                  </tr>
135
                  </tr>
135
                  <tr>
136
                  <tr>
136
                    <th colspan="5" class="NoSort">&nbsp;</th>
137
                    <th colspan="5" class="NoSort">&nbsp;</th>
137
                    <th class="NoSort">Staff interface</th>
138
                    <th class="NoSort">Staff interface</th>
138
                    <th class="NoSort">OPAC</th>
139
                    <th class="NoSort">OPAC</th>
140
                    <th>&nbsp;</th>
139
                  </tr>
141
                  </tr>
140
                </thead>
142
                </thead>
141
                <tbody>
143
                <tbody>
Lines 237-245 a.add, a.delete { Link Here
237
                          [% END %]
239
                          [% END %]
238
                        </select>
240
                        </select>
239
                      </td>
241
                      </td>
242
                      <td>
243
                        [% IF search_field.is_mapped %]
244
                          <a class="btn btn-default btn-xs disabled delete" style="cursor: pointer;"><i class="fa fa-trash"></i> Delete</a>
245
                        [% ELSE %]
246
                          <a class="btn btn-default btn-xs delete" style="cursor: pointer;"><i class="fa fa-trash"></i> Delete</a>
247
                        [% END %]
248
                      </td>
240
                    </tr>
249
                    </tr>
241
                  [% END %]
250
                  [% END %]
242
                </tbody>
251
                </tbody>
252
                <tfoot>
253
                  <tr>
254
                    <td>
255
                      <input type="text" data-id="search_field_name"/>
256
                    </td>
257
                    <td></td>
258
                    <td>
259
                      <input type="text" data-id="search_field_label"/>
260
                    </td>
261
                    <td>
262
                      <select data-id="search_field_type">
263
                        <option value=""></option>
264
                        <option value="string">String</option>
265
                        <option value="date">Date</option>
266
                        <option value="year">Year</option>
267
                        <option value="number">Number</option>
268
                        <option value="boolean">Boolean</option>
269
                        <option value="sum">Sum</option>
270
                        <option value="isbn">ISBN</option>
271
                        <option value="stdno">Std. Number</option>
272
                      </select>
273
                    </td>
274
                    <td>
275
                      <input type="text" data-id="search_field_weight" value="">
276
                    </td>
277
                    <td>
278
                      <select data-id="search_field_staff_client">
279
                        <option value="1">Yes</option>
280
                        <option value="0">No</option>
281
                      </select>
282
                    </td>
283
                    <td>
284
                      <select data-id="search_field_opac">
285
                        <option value="1">Yes</option>
286
                        <option value="0">No</option>
287
                      </select>
288
                    </td>
289
                    <td><a class="btn btn-default btn-xs add-search-field"><i class="fa fa-plus"></i> Add</a></td>
290
                  </tr>
291
                </tfoot>
243
              </table>
292
              </table>
244
            </div>
293
            </div>
245
            [% FOREACH index IN indexes %]
294
            [% FOREACH index IN indexes %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/elasticsearch-mappings.js (-12 / +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-64 $(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();
57
        }
58
            var line = $(this).closest("tr");
58
    });
59
59
60
    $("table.mappings").tableDnD({
60
            var name;
61
        onDragClass: "dragClass",
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
            }
76
        }
62
    });
77
    });
63
78
64
    $('.add').click(function () {
79
    $('.add').click(function () {
Lines 68-85 $(document).ready(function () { Link Here
68
        var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
83
        var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
69
        if (marc_field.length > 0) {
84
        if (marc_field.length > 0) {
70
            var new_line = clone_line(line);
85
            var new_line = clone_line(line);
86
            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'));
87
            new_line.appendTo($('table[data-index_name="' + index_name + '"]>tbody'));
72
            $('.delete').click(function () {
73
                $(this).parents('tr').remove();
74
            });
75
            clean_line(line);
76
88
77
            $(table).tableDnD({
89
            var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
78
                onDragClass: "dragClass",
90
            $(search_field_line).find('a.btn-default').addClass('disabled');
79
            });
91
92
            clean_line(line);
80
        }
93
        }
81
    });
94
    });
82
    $("#facet_biblios > table").tableDnD({
95
    $("#facet_biblios > table").tableDnD({
83
        onDragClass: "dragClass",
96
        onDragClass: "dragClass",
84
    });
97
    });
98
99
    $('.add-search-field').click(function() {
100
        var table = $(this).closest('table');
101
        var line = $(this).closest("tr");
102
        var name = $(line).find('input[data-id="search_field_name"]').val();
103
        let already_exist = 0;
104
105
        if ( $('input[name="search_field_name"][value="' + name + '"]').val() ) {
106
            already_exist = 1;
107
        }
108
109
        if (already_exist) {
110
            alert("SearchField "+ name + " already exist");
111
        } else {
112
            var label = $(line).find('input[data-id="search_field_label"]').val();
113
            if ( name.length > 0 && label.length > 0 ) {
114
                var new_line = clone_line( line );
115
                new_line.appendTo(table.find('tbody'));
116
                clean_line(line);
117
            }
118
        }
119
    });
85
});
120
});
(-)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