Koha/koha-tmpl/intranet-tmpl/prog/js/elasticsearch-mappings.js
Jonathan Druart 901f550a47
Bug 36396: Link facet with authorised value category - ES
This new feature adds the ability to link an ES facet to an authorised
value category, in order to display a description instead of the code.

Test plan:
1. Go to the ES mapping admin page
2. Notice the new "Authorized value category" column in the facets
   config table
3. Create a new facet that is linked to a search field containing values
   from an authorised value category. Pick this category in the list
4. Save
5. Reindex
6. Notice that the descriptions are now displayed (staff and OPAC) in
   the search result page.

QA: See the related bug report for possible improvements. It's not
easy at all to deal with the "specials" here, a lot of changes must be
done in how we fetch/cache the AVs.

Sponsored-by: The Research University in the Helmholtz Association (KIT)
Signed-off-by: Lukas Koszyk <lukasz.koszyk@kit.edu>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
2024-05-07 15:53:53 +02:00

188 lines
7.2 KiB
JavaScript

/* global __ dataTablesDefaults */
function clean_line(line) {
$(line).find('input[type="text"]').val("");
$(line).find('select').find('option:first').prop("selected", true);
}
function build_delete_link(del_class){
return '<a class="btn btn-default btn-xs %s" style="cursor: pointer;"><i class="fa fa-trash"></i> %s</a>'.format(del_class, __("Delete"));
}
function remove_line(line){
var table = $(line).closest('table');
let dt = $(table).DataTable();
dt.row(line).remove().draw();
}
function clone_line(line) {
var new_line = $(line).clone();
let type = $(line).data('type');
$(new_line).find('td:last-child').html(build_delete_link('delete-%s'.format(type)));
$(new_line).find('[data-id]').each(function () {
$(this).attr({ name: $(this).attr('data-id') }).removeAttr('data-id');
});
$(new_line).find("select").each(function () {
var attr = $(this).attr('name');
var val = $(line).find('[data-id="' + attr + '"]').val();
$(this).find('option').removeAttr('selected');
$(this).find('option[value="' + val + '"]').attr("selected", "selected");
});
return new_line;
}
function tableInit( oldtabid, newtabid ) {
if ( oldtabid ){
var oldTableId = $("#" + oldtabid + "_table");
oldTableId.DataTable().destroy();
}
var newTableId = $("#" + newtabid + "_table");
newTableId.DataTable(
$.extend(true, {}, dataTablesDefaults, {
"columnDefs": [
{ "orderable": false, "searchable": false, 'targets': ['NoSort'] },
],
"paging": false,
"autoWidth": false
}));
}
$(document).ready(function () {
tableInit( "", "search_fields");
$("a[data-toggle='tab']").on("shown.bs.tab", function (e) {
var oldtabid = $(e.relatedTarget).data("tabname");
var newtabid = $(e.target).data("tabname");
tableInit( oldtabid, newtabid );
});
$(document).on('click', '.delete-facet', function() {
var line = $(this).closest("tr");
remove_line(line);
});
$(document).on('click', '.delete-mapping', function() {
var line = $(this).closest("tr");
remove_line(line);
});
$(document).on('click', '.delete-search-field', function() {
if ($(this).hasClass('mandatory') && $(".mandatory[data-field_name=" + $(this).attr('data-field_name') + "]").length < 2) {
alert( __("This field is mandatory and must have at least one mapping") );
return;
} else {
var line = $(this).closest("tr");
var name;
// We clicked delete button on search fields tab.
if (name = $(line).find('input[name="search_field_name"]').val()) {
// Prevent user from using a search field for a mapping
// after removing it without saving.
$('select[data-id="mapping_search_field_name"]').each(function( index, element) {
$(element).find('option[value="' + name + '"]').remove();
});
}
var search_field_name = $(line).find('input[name="mapping_search_field_name"]').val();
var mappings = $('input[name="mapping_search_field_name"][type="hidden"][value="' + search_field_name + '"]');
if (mappings.length == 0) {
var search_field_line = $('input[name="search_field_name"][value="' + search_field_name + '"]').closest("tr");
$(search_field_line).find('a.btn-default').removeClass('disabled');
}
remove_line(line);
}
});
$('.add').click(function () {
var table = $(this).closest('table');
let table_id = table.attr('id');
let dt = $('#' + table_id).DataTable();
var line = $(this).closest("tr");
var marc_field = $(line).find('input[data-id="mapping_marc_field"]').val();
let dt_data = dt.data();
if ( marc_field.length ) {
var new_line = clone_line(line);
var index_name = $(table).attr('data-index_name');
let dt = $('#' + table_id).DataTable();
dt.row.add(new_line).draw();
clean_line(line);
}
});
$("#facet_biblios_table").DataTable(
$.extend(true, {}, dataTablesDefaults, {
"columnDefs": [
{ "orderable": false, "targets": [ "NoSort" ] },
{ "searchable": false, "visible": false, "targets": 0 }
],
"dom": "t",
"paging": false,
"autoWidth": false,
"rowReorder": true
}));
$("#es_mappings").on("submit", function(e){
let table_ids = ['search_fields_table', 'mapping_biblios_table', 'mapping_authorities_table'];
$(table_ids).each(function(){
let table;
// Remove warning "Cannot reinitialise DataTable"
if ( $.fn.dataTable.isDataTable( '#' + this ) ) {
table = $('#' + this).DataTable();
}
else {
table = $('#' + this).DataTable( {
paging: false
} );
}
table.search('').draw();
});
return true;
});
$('.add-search-field').click(function() {
var table = $(this).closest('table');
let table_id = table.attr('id');
let dt = $('#' + table_id).DataTable();
var line = $(this).closest('tr');
var search_field_name = $(line).find('input[data-id="search_field_name"]').val();
let already_exists = dt.data().filter((row, idx) => row[0]['@data-order'] === search_field_name);
if ( already_exists.length ) {
alert(__("Search field '%s' already exists".format(search_field_name)));
return;
}
if (search_field_name.length > 0) {
var new_line = clone_line(line);
new_line.find('td:first').attr({'data-order': search_field_name});
dt.row.add(new_line).draw();
clean_line(line);
}
});
$('.add-facet').click(function() {
var table = $(this).closest('table');
let table_id = table.attr('id');
let dt = $('#' + table_id).DataTable();
var line = $(this).closest('tr');
let selected_option = $(line).find('select[data-id="facet-search-field"] option:selected');
var search_field_name = selected_option.val();
let dt_data = dt.data();
let already_exists = dt_data.filter((row, idx) => row[1] === search_field_name);
if ( already_exists.length ) {
alert(__("Facet '%s' already exists".format(search_field_name)));
return;
}
if (search_field_name.length > 0) {
const next_id = Math.max.apply(null, dt_data.map(row => row[0])) + 1;
const label = selected_option.data('label');
const av_cat_select = $(clone_line(line).find('td')[2]).find('select').attr({name: 'facet_av_cat_%s'.format(search_field_name.escapeHtml())});
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()]
dt.row.add(new_line).draw();
clean_line(line);
}
});
});