Bug 36396: Link facet with authorised value category - ES
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / elasticsearch-mappings.js
1 /* global __ dataTablesDefaults */
2
3 function clean_line(line) {
4     $(line).find('input[type="text"]').val("");
5     $(line).find('select').find('option:first').prop("selected", true);
6 }
7
8 function build_delete_link(del_class){
9     return '<a class="btn btn-default btn-xs %s" style="cursor: pointer;"><i class="fa fa-trash"></i> %s</a>'.format(del_class, __("Delete"));
10 }
11
12 function remove_line(line){
13     var table = $(line).closest('table');
14     let dt = $(table).DataTable();
15     dt.row(line).remove().draw();
16 }
17
18 function clone_line(line) {
19     var new_line = $(line).clone();
20     let type = $(line).data('type');
21     $(new_line).find('td:last-child').html(build_delete_link('delete-%s'.format(type)));
22     $(new_line).find('[data-id]').each(function () {
23         $(this).attr({ name: $(this).attr('data-id') }).removeAttr('data-id');
24     });
25     $(new_line).find("select").each(function () {
26         var attr = $(this).attr('name');
27         var val = $(line).find('[data-id="' + attr + '"]').val();
28         $(this).find('option').removeAttr('selected');
29         $(this).find('option[value="' + val + '"]').attr("selected", "selected");
30     });
31     return new_line;
32 }
33
34 function tableInit( oldtabid, newtabid ) {
35     if ( oldtabid ){
36         var oldTableId = $("#" + oldtabid + "_table");
37         oldTableId.DataTable().destroy();
38     }
39
40     var newTableId = $("#" + newtabid + "_table");
41     newTableId.DataTable(
42         $.extend(true, {}, dataTablesDefaults, {
43             "columnDefs": [
44                 { "orderable": false, "searchable": false, 'targets': ['NoSort'] },
45             ],
46             "paging": false,
47             "autoWidth": false
48         }));
49 }
50
51 $(document).ready(function () {
52
53     tableInit( "", "search_fields");
54
55     $("a[data-toggle='tab']").on("shown.bs.tab", function (e) {
56         var oldtabid = $(e.relatedTarget).data("tabname");
57         var newtabid = $(e.target).data("tabname");
58         tableInit( oldtabid, newtabid );
59     });
60
61     $(document).on('click', '.delete-facet', function() {
62         var line = $(this).closest("tr");
63         remove_line(line);
64     });
65     $(document).on('click', '.delete-mapping', function() {
66         var line = $(this).closest("tr");
67         remove_line(line);
68     });
69     $(document).on('click', '.delete-search-field', function() {
70         if ($(this).hasClass('mandatory') && $(".mandatory[data-field_name=" + $(this).attr('data-field_name') + "]").length < 2) {
71             alert( __("This field is mandatory and must have at least one mapping") );
72             return;
73         } else {
74             var line = $(this).closest("tr");
75
76             var name;
77             // We clicked delete button on search fields tab.
78             if (name = $(line).find('input[name="search_field_name"]').val()) {
79                 // Prevent user from using a search field for a mapping
80                 // after removing it without saving.
81                 $('select[data-id="mapping_search_field_name"]').each(function( index, element) {
82                     $(element).find('option[value="' + name + '"]').remove();
83                 });
84             }
85
86             var search_field_name = $(line).find('input[name="mapping_search_field_name"]').val();
87             var mappings = $('input[name="mapping_search_field_name"][type="hidden"][value="' + search_field_name + '"]');
88             if (mappings.length == 0) {
89                 var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
90                 $(search_field_line).find('a.btn-default').removeClass('disabled');
91             }
92
93             remove_line(line);
94         }
95     });
96
97     $('.add').click(function () {
98         var table = $(this).closest('table');
99         let table_id = table.attr('id');
100         let dt = $('#' + table_id).DataTable();
101         var line = $(this).closest("tr");
102         var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
103         let dt_data = dt.data();
104         if ( marc_field.length ) {
105             var new_line = clone_line(line);
106             var index_name = $(table).attr('data-index_name');
107             let dt = $('#' + table_id).DataTable();
108             dt.row.add(new_line).draw();
109
110             clean_line(line);
111         }
112     });
113
114     $("#facet_biblios_table").DataTable(
115         $.extend(true, {}, dataTablesDefaults, {
116             "columnDefs": [
117                 { "orderable": false, "targets": [ "NoSort" ] },
118                 { "searchable": false, "visible": false, "targets": 0 }
119             ],
120             "dom": "t",
121             "paging": false,
122             "autoWidth": false,
123             "rowReorder": true
124         }));
125
126     $("#es_mappings").on("submit", function(e){
127         let table_ids = ['search_fields_table', 'mapping_biblios_table', 'mapping_authorities_table'];
128         $(table_ids).each(function(){
129             let table;
130             // Remove warning "Cannot reinitialise DataTable"
131             if ( $.fn.dataTable.isDataTable( '#' + this ) ) {
132                 table = $('#' + this).DataTable();
133             }
134             else {
135                 table = $('#' + this).DataTable( {
136                     paging: false
137                 } );
138             }
139             table.search('').draw();
140         });
141         return true;
142     });
143
144     $('.add-search-field').click(function() {
145         var table = $(this).closest('table');
146         let table_id = table.attr('id');
147         let dt = $('#' + table_id).DataTable();
148         var line = $(this).closest('tr');
149         var search_field_name = $(line).find('input[data-id="search_field_name"]').val();
150         let already_exists = dt.data().filter((row, idx) => row[0]['@data-order'] === search_field_name);
151         if ( already_exists.length ) {
152             alert(__("Search field '%s' already exists".format(search_field_name)));
153             return;
154         }
155         if (search_field_name.length > 0) {
156             var new_line = clone_line(line);
157             new_line.find('td:first').attr({'data-order': search_field_name});
158             dt.row.add(new_line).draw();
159
160             clean_line(line);
161         }
162     });
163
164     $('.add-facet').click(function() {
165         var table = $(this).closest('table');
166         let table_id = table.attr('id');
167         let dt = $('#' + table_id).DataTable();
168         var line = $(this).closest('tr');
169         let selected_option = $(line).find('select[data-id="facet-search-field"] option:selected');
170         var search_field_name = selected_option.val();
171         let dt_data = dt.data();
172         let already_exists = dt_data.filter((row, idx) => row[1] === search_field_name);
173         if ( already_exists.length ) {
174             alert(__("Facet '%s' already exists".format(search_field_name)));
175             return;
176         }
177         if (search_field_name.length > 0) {
178             const next_id = Math.max.apply(null, dt_data.map(row => row[0])) + 1;
179             const label = selected_option.data('label');
180             const av_cat_select = $(clone_line(line).find('td')[2]).find('select').attr({name: 'facet_av_cat_%s'.format(search_field_name.escapeHtml())});
181             new_line = [next_id, search_field_name, '<span>%s</span><input type="hidden" name="facet_name" value="%s" />'.format(label.escapeHtml(), search_field_name.escapeHtml()), av_cat_select[0].outerHTML, build_delete_link()]
182             dt.row.add(new_line).draw();
183
184             clean_line(line);
185         }
186     });
187
188 });