From a0b1c7785ea71152a803f4cb703e5e5900c0fae6 Mon Sep 17 00:00:00 2001 From: rnsrk Date: Thu, 9 Jan 2025 18:27:23 +0100 Subject: [PATCH] new version with ajax --- conjuction_parantheses_correction.patch | 68 +++++++++ js/advanced_search.entityFields copy.js | 189 ++++++++++++++++++++++++ js/advanced_search.entityFields.js | 89 +---------- js/advanced_search.form.js | 14 +- js/facets/facets-views-ajax.js | 24 +-- src/AdvancedSearchQuery.php | 16 +- src/AdvancedSearchQueryTerm.php | 6 +- src/Form/AdvancedSearchForm.php | 137 ++++++++++++++++- 8 files changed, 415 insertions(+), 128 deletions(-) create mode 100644 conjuction_parantheses_correction.patch create mode 100644 js/advanced_search.entityFields copy.js diff --git a/conjuction_parantheses_correction.patch b/conjuction_parantheses_correction.patch new file mode 100644 index 0000000..aa0957c --- /dev/null +++ b/conjuction_parantheses_correction.patch @@ -0,0 +1,68 @@ +diff --git a/src/AdvancedSearchQuery.php b/src/AdvancedSearchQuery.php +index af40fb7..b8c6eb7 100644 +--- a/src/AdvancedSearchQuery.php ++++ b/src/AdvancedSearchQuery.php +@@ -143,6 +143,7 @@ class AdvancedSearchQuery { + public function alterQuery(Request $request, SolariumQueryInterface &$solarium_query, DrupalQueryInterface $search_api_query) { + // Only apply if a Advanced Search Query was made. + $terms = $this->getTerms($request); ++ + if (!empty($terms)) { + $index = $search_api_query->getIndex(); + /** @var \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend $backend */ +@@ -163,11 +164,10 @@ class AdvancedSearchQuery { + + if (!$isDismax) { + // To support negative queries we must first bring in all documents. +- $q[] = $this->negativeQuery($terms) ? "*:*" : ""; ++ $q = $this->negativeQuery($terms) ? "*:*" : ""; + } +- + $term = array_shift($terms); +- $q[] = $term->toSolrQuery($field_mapping); ++ $q = '(' . trim($term->toSolrQuery($field_mapping)); + + // New. + $fields_list[] = $term->toSolrFields($field_mapping); +@@ -180,8 +180,8 @@ class AdvancedSearchQuery { + + // For multiple conditions. + foreach ($terms as $term) { +- $q[] = $term->getConjunction(); +- $q[] = $term->toSolrQuery($field_mapping); ++ $q .= ')' . $term->getConjunction() . '('; ++ $q .= trim($term->toSolrQuery($field_mapping)); + + // New. + $fields_list[] = $term->toSolrFields($field_mapping); +@@ -193,8 +193,8 @@ class AdvancedSearchQuery { + } + + } +- $q = implode(' ', $q); + ++ $q .= ')'; + // Limit extra processing if Luncene Search is enable. + if ($isDismax) { + +@@ -257,7 +257,7 @@ class AdvancedSearchQuery { + foreach ($index->getFields() as $field_id => $field) { + $boostedFields[$field_id] = $field->getBoost(); + } +- ++ + $str_fields_with_boost = ""; + // Adding a boost number for each field) + foreach($query_fields as $solr_field) { +@@ -291,11 +291,9 @@ class AdvancedSearchQuery { + // make this field non-empty. + //$search_api_query->keys("advanced search"); + } +- + $solarium_query->setQuery($q); + } + } +- + /** + * Alters the given view to be recursive if applicable. + * diff --git a/js/advanced_search.entityFields copy.js b/js/advanced_search.entityFields copy.js new file mode 100644 index 0000000..d881dcb --- /dev/null +++ b/js/advanced_search.entityFields copy.js @@ -0,0 +1,189 @@ +(function ($, Drupal, drupalSettings) { + + function toDropdown(field, i) { + let searchValueSelectId = 'edit-terms-' + i + '-value'; + let SearchValueFieldselector = "[id^='" + searchValueSelectId + "']"; + let $searchValueInputField = $(SearchValueFieldselector); + $searchValueInputField.hide(); + let $oldHelperField = $('#edit-terms-' + i + '-helper'); + $oldHelperField.remove(); + $searchValueInputField.after(''); + let $newHelperField = $('#edit-terms-' + i + '-helper'); + if (['agg__arch__transaktion', 'agg__all__transaktion'].includes(field)) { // Transaktion + $newHelperField.empty(); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + } else if (['agg__all__objektkategorie', 'agg__arch__objektkategorie', 'agg__obj__objektkategorie'].includes(field)) { // Objektkategorie + $newHelperField.empty(); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + $newHelperField.append(''); + } + $newHelperField.change(function () { + let selectedOption = $newHelperField.find('option:selected'); + $searchValueInputField.val(selectedOption.val()).text(selectedOption.text()); + }); + } + + Drupal.behaviors.advanceSearchEntityFields = { + attach: function attach(context, settings) { + let $searchSelectElement = $('[id^="edit-terms-0-search"]'); + let originalSearchSelectOptions = $searchSelectElement.find('option').clone(); + $searchSelectElement.empty(); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $searchSelectElement.append(''); + $(document).on('change', '.advanced-search-form--entity', function () { + let id = $(this).attr('id'); + let i = id.substring(11, 12); + let $select = $('#' + id); + let searchSelectId = 'edit-terms-' + i + '-search'; + let selector = "[id^='" + searchSelectId + "']"; + let $searchSelect = $(selector); + if ($select.val() === 'akteur') { // Akteur + $searchSelect.empty(); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + } + else if ($select.val() === 'b48556e79962e0a3c8d0041317c853b9') { // Archivalie + $searchSelect.empty(); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + } + else if ($select.val() === 'ba419826c9014f40126565bf413f7a59') { // Auktion + $searchSelect.empty(); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + } else if ($select.val() === 'b65c3a85d16724d84a5eb0d2268629a6') { // Objekt + $searchSelect.empty(); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + } else if ($select.val() === 'ueberall') { + $searchSelect.empty(); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + $searchSelect.append(''); + + } + }); + let urlParams = new URLSearchParams(window.location.search); + let params = {}; + let p = {}; + for (const param of urlParams) { + let key = param[0].split('['); + let value = param[1]; + let obj = p; + for (let i = 0; i < key.length - 1; i++) { + let k = key[i].replace(']', ''); + if (!obj.hasOwnProperty(k)) { + obj[k] = {}; + } + obj = obj[k]; + } + let lastKey = key[key.length - 1].replace(']', ''); + obj[lastKey] = value; + } + params = p; + $(document).on('change', '.advanced-search-form--select-field', function () { + let id = $(this).attr('id'); + let i = id.substring(11, 12); + let field = $(this).val(); + if (['agg__arch__transaktion', 'agg__all__transaktion', 'agg__all__objektkategorie', 'agg__arch__objektkategorie', 'agg__obj__objektkategorie'].includes(field)) { + let dropdown = toDropdown(field, i); + } else { + let searchValueSelectId = 'edit-terms-' + i + '-value'; + let SearchValueFieldselector = "[id^='" + searchValueSelectId + "']"; + let $searchValueInputField = $(SearchValueFieldselector); + $searchValueInputField.show(); + let $oldHelperField = $('#edit-terms-' + i + '-helper'); + $oldHelperField.remove(); + } + }); + } + }; + +})(jQuery, Drupal, drupalSettings); diff --git a/js/advanced_search.entityFields.js b/js/advanced_search.entityFields.js index 4500555..695a146 100644 --- a/js/advanced_search.entityFields.js +++ b/js/advanced_search.entityFields.js @@ -31,7 +31,7 @@ $newHelperField.append(''); $newHelperField.append(''); $newHelperField.append(''); - } else if ([ 'agg__all__objektkategorie', 'agg__arch__objektkategorie', 'agg__obj__objektkategorie'].includes(field)) { // Objektkategorie + } else if (['agg__all__objektkategorie', 'agg__arch__objektkategorie', 'agg__obj__objektkategorie'].includes(field)) { // Objektkategorie $newHelperField.empty(); $newHelperField.append(''); $newHelperField.append(''); @@ -65,97 +65,11 @@ Drupal.behaviors.advanceSearchEntityFields = { attach: function attach(context, settings) { - let $searchSelectElement = $('[id^="edit-terms-0-search"]'); - let originalSearchSelectOptions = $searchSelectElement.find('option').clone(); - $searchSelectElement.empty(); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $searchSelectElement.append(''); - $(document).on('change', '.advanced-search-form--entity', function () { - let id = $(this).attr('id'); - let i = id.substring(11, 12); - let $select = $('#' + id); - let searchSelectId = 'edit-terms-' + i + '-search'; - let selector = "[id^='" + searchSelectId + "']"; - let $searchSelect = $(selector); - if ($select.val() === 'akteur') { // Akteur - $searchSelect.empty(); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - } - else if ($select.val() === 'b48556e79962e0a3c8d0041317c853b9') { // Archivalie - $searchSelect.empty(); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - } - else if ($select.val() === 'ba419826c9014f40126565bf413f7a59') { // Auktion - $searchSelect.empty(); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - } else if ($select.val() === 'b65c3a85d16724d84a5eb0d2268629a6') { // Objekt - $searchSelect.empty(); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - } else if ($select.val() === 'ueberall') { - $searchSelect.empty(); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - $searchSelect.append(''); - - } - }); - $(document).on('change', '.advanced-search-form--select-field', function () { let id = $(this).attr('id'); let i = id.substring(11, 12); let field = $(this).val(); if (['agg__arch__transaktion', 'agg__all__transaktion', 'agg__all__objektkategorie', 'agg__arch__objektkategorie', 'agg__obj__objektkategorie'].includes(field)) { - console.log(field); let dropdown = toDropdown(field, i); } else { let searchValueSelectId = 'edit-terms-' + i + '-value'; @@ -166,7 +80,6 @@ $oldHelperField.remove(); } }); - } }; diff --git a/js/advanced_search.form.js b/js/advanced_search.form.js index 389f836..c0fc4f3 100644 --- a/js/advanced_search.form.js +++ b/js/advanced_search.form.js @@ -138,14 +138,6 @@ e.preventDefault(); e.stopPropagation(); let inputs = $form.serializeArray(); - //console.log(inputs); - //inputs = inputs.filter(function(el) { - // return !el.name.match(/terms\[\d+\]\[entity\]/); - //}); - - //inputs = originalInputs; - //console.log(inputs); - const href = url(inputs, settings.advanced_search_form); /* digitalutsc added*/ @@ -177,7 +169,9 @@ } }); window.history.pushState(null, document.title, href); + }); + } // Reset should trigger refresh of AJAX Blocks / Views. $form.find('input[data-drupal-selector = "edit-reset"]').mousedown(function (e) { @@ -192,13 +186,15 @@ // Handle the page summary $("#ajax-page-summary").hide(); $( document ).ajaxComplete(function( event, request, settings ) { - $("#ajax-page-summary").hide(); + //$("#ajax-page-summary").hide(); if (jQuery("#ajax-page-summary").length >0) { $(".pager__summary").html($("#ajax-page-summary").html()); } else { $(".pager__summary").html(""); } + $('.boehler-js-disabled').removeClass('boehler-js-disabled'); + }); } } diff --git a/js/facets/facets-views-ajax.js b/js/facets/facets-views-ajax.js index 04fb0c0..033219b 100644 --- a/js/facets/facets-views-ajax.js +++ b/js/facets/facets-views-ajax.js @@ -28,7 +28,6 @@ temp = queries[i].split('='); params[temp[0]] = temp[1]; } - return params; }; @@ -54,15 +53,15 @@ }); } - // Update items_per_page links in pager - if (url.indexOf("items_per_page=") == -1) { + // Update items_per_page links in pager + if (url.indexOf("items_per_page=") == -1) { // append items_per_page $("a.pager__itemsperpage").each(function( index ) { var newUrl = url + "&items_per_page=" + $(this).html(); $(this).attr("href", newUrl); }); - } - else { + } + else { // replace existed items_per_page var params = parseQueryString(url.split("?")[1]); var newParams = []; @@ -76,7 +75,7 @@ } // check for items_per_page query - if (!key.startsWith("items_per_page")) { + if (!key.startsWith("items_per_page")) { newParams.push(key + "=" + params[key]); } } @@ -88,15 +87,15 @@ - // Update display mode links in pager - if (url.indexOf("display=") == -1) { + // Update display mode links in pager + if (url.indexOf("display=") == -1) { // append items_per_page $("a.pager__display").each(function( index ) { var newUrl = url + "&display=" + $(this).find(".display-mode").html().toLowerCase(); $(this).attr("href", newUrl); }); - } - else { + } + else { // replace existed display var params = parseQueryString(url.split("?")[1]); var newParams = []; @@ -110,7 +109,7 @@ } // check for display query - if (!key.startsWith("display")) { + if (!key.startsWith("display")) { newParams.push(key + "=" + params[key]); } } @@ -123,7 +122,7 @@ } - + // Replace filter, pager, summary, and facet blocks. var blocks = {}; $( @@ -191,6 +190,7 @@ var params = Drupal.Views.parseQueryString(href); // Remove the page if set as submitting the form should always take // the user to the first page (facets do the same). + console.log("params", params); delete params.page; // Include values from the form in the URL. $.each(exposed_form.serializeArray(), function () { diff --git a/src/AdvancedSearchQuery.php b/src/AdvancedSearchQuery.php index d49a925..b8c6eb7 100644 --- a/src/AdvancedSearchQuery.php +++ b/src/AdvancedSearchQuery.php @@ -143,6 +143,7 @@ class AdvancedSearchQuery { public function alterQuery(Request $request, SolariumQueryInterface &$solarium_query, DrupalQueryInterface $search_api_query) { // Only apply if a Advanced Search Query was made. $terms = $this->getTerms($request); + if (!empty($terms)) { $index = $search_api_query->getIndex(); /** @var \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend $backend */ @@ -163,11 +164,10 @@ class AdvancedSearchQuery { if (!$isDismax) { // To support negative queries we must first bring in all documents. - $q[] = $this->negativeQuery($terms) ? "*:*" : ""; + $q = $this->negativeQuery($terms) ? "*:*" : ""; } - $q[] = '('; $term = array_shift($terms); - $q[] = $term->toSolrQuery($field_mapping); + $q = '(' . trim($term->toSolrQuery($field_mapping)); // New. $fields_list[] = $term->toSolrFields($field_mapping); @@ -180,8 +180,8 @@ class AdvancedSearchQuery { // For multiple conditions. foreach ($terms as $term) { - $q[] = ')' . $term->getConjunction() . '('; - $q[] = $term->toSolrQuery($field_mapping); + $q .= ')' . $term->getConjunction() . '('; + $q .= trim($term->toSolrQuery($field_mapping)); // New. $fields_list[] = $term->toSolrFields($field_mapping); @@ -194,9 +194,7 @@ class AdvancedSearchQuery { } - $q[] = ')'; - $q = implode(' ', $q); - + $q .= ')'; // Limit extra processing if Luncene Search is enable. if ($isDismax) { @@ -293,11 +291,9 @@ class AdvancedSearchQuery { // make this field non-empty. //$search_api_query->keys("advanced search"); } - dpm($q, "q"); $solarium_query->setQuery($q); } } - /** * Alters the given view to be recursive if applicable. * diff --git a/src/AdvancedSearchQueryTerm.php b/src/AdvancedSearchQueryTerm.php index e83c0d7..103f4f4 100644 --- a/src/AdvancedSearchQueryTerm.php +++ b/src/AdvancedSearchQueryTerm.php @@ -337,16 +337,16 @@ class AdvancedSearchQueryTerm { // If field fulltext title is selected. if (strpos($field, "fulltext_title") !== FALSE) { $isTitleSearch = TRUE; - if (strpos(trim($value), " AND ") !== FALSE) { + if (strpos(trim($value), "AND") !== FALSE) { // Handle keyword with 'Orientation AND games'. $keyword = str_replace('"', '', $value); - $keys = explode(" AND ", $keyword); + $keys = explode("AND", $keyword); $str = "("; $i = 0; foreach ($keys as $key) { if ($i != count($keys) - 1) { - $str .= $field . ':"' . $key . '" AND '; + $str .= $field . ':"' . $key . '"AND'; } else { $str .= $field . ':"' . $key . '")'; diff --git a/src/Form/AdvancedSearchForm.php b/src/Form/AdvancedSearchForm.php index cf9e068..81d6ff8 100644 --- a/src/Form/AdvancedSearchForm.php +++ b/src/Form/AdvancedSearchForm.php @@ -45,6 +45,71 @@ class AdvancedSearchForm extends FormBase { const AJAX_WRAPPER = 'advanced-search-ajax'; + const ACTOR_OPTIONS = [ + "agg__akt__anmerkung" => "Anmerkung", + "f20673c10d8d786816de3c4338d1c3ac" =>" Art der Institution", + "fb7ca3fb25fe824b40d6923e212ee7c4" => "Beruf/ Tätigkeit", + "agg__akt__name" => "Name" + ]; + + const PROPERTY_CARD_OPTIONS = [ + 'agg__arch__akteur' => 'Akteur', + 'agg_arch__anmerkung' => 'Anmerkung', + 'agg__arch__auktionstitel' => 'Auktionstitel', + 'f807d62b374606e52e8833118375ecb0' => 'Karteikarten-ID', + 'agg__arch__kue_herst' => 'Künster:in/ Hersteller:in', + 'agg__arch__objektkategorie' => 'Objektkategorie', + 'agg__arch__ort_reg' => 'Ort/ Region', + ]; + const AUCTION_OPTIONS = [ + 'agg__aukt__akt' => 'Akteur', + 'f11ead3fa212224b6e82ce5622c1d99c' => 'Anmerkung', + 'ff8fb361d19f1fb4030605f87cb995ff' => 'Auktionshaus', + 'f4394d15487b58f49c719cf850f57e3a' => 'Auktionskatalog', + 'f6230cbdc56e0f04a90424b248680c76' => 'Titel der Auktion', + ]; + + const OBJECT_OPTIONS = [ + 'agg__obj__anmerkung' => 'Anmerkung', + 'agg__obj__akt' => 'Akteur', + 'agg__obj__auktionshaus' => 'Auktionshaus', + 'agg__obj__auktionstitel' => 'Auktionstitel', + 'agg__obj__kue_herst' => 'Künstler:in/ Hersteller:in', + 'agg__obj__lotnummer' => 'Lotnummer', + 'fe03f1bcb9bf84f6fa8bf265090313c5' => 'Objekt-ID', + 'agg__obj__titel' => 'Objekttitel', + 'agg__obj__objektkategorie' => 'Objektkategorie', + 'agg__obj__ort_regi' => 'Ort/Region', + ]; + const ALL_OPTIONS = [ + 'all' => 'Keyword', + 'agg__all__akt' => 'Akteur', + 'agg__all__anmerkung' => 'Anmerkung', + 'f20673c10d8d786816de3c4338d1c3ac' => 'Art der Institution', + 'agg__all__auktionshaus' => 'Auktionshaus', + 'f4394d15487b58f49c719cf850f57e3a' => 'Auktionskatalog', + 'agg__all_auktionstitel' => 'Auktionstitel', + 'fb7ca3fb25fe824b40d6923e212ee7c4' => 'Beruf/ Tätigkeit', + 'fd4b844b736f2215421ead5b2fc0f5ef' => 'Fotonummer', + 'f807d62b374606e52e8833118375ecb0' => 'Karteikarten-ID', + 'agg__all__kue_herst' => 'Künstler:in/ Hersteller:in', + 'agg__obj__lotnummer' => 'Lotnummer', + 'fe03f1bcb9bf84f6fa8bf265090313c5' => 'Objekt-ID', + 'agg__all__objektkategorie' => 'Objektkategorie', + 'agg__all__objekttitel' => 'Objekttitel', + 'agg__all__ort_regi' => 'Ort/Region', + 'agg__all__transaktion' => 'Transaktion', + ]; + + // Define your options. + const ENTITY_OPTIONS = [ + 'ueberall' => self::ALL_OPTIONS, + 'akteur' => self::ACTOR_OPTIONS, + 'b48556e79962e0a3c8d0041317c853b9' => self::PROPERTY_CARD_OPTIONS, + 'ba419826c9014f40126565bf413f7a59' => self::AUCTION_OPTIONS, + 'b65c3a85d16724d84a5eb0d2268629a6' => self::OBJECT_OPTIONS, + ]; + /** * The current request. * @@ -250,6 +315,30 @@ class AdvancedSearchForm extends FormBase { return NULL; } + protected function setSearchValue(&$term_value) { + switch ($term_value['entity']) { + case 'ueberall': + $term_value['search'] = 'all'; + break; + case 'akteur': + $term_value['search'] = 'agg__akt__name'; + break; + case 'b48556e79962e0a3c8d0041317c853b9': + $term_value['search'] = 'agg__arch__akteur'; + break; + case 'ba419826c9014f40126565bf413f7a59': + $term_value['search'] = 'f6230cbdc56e0f04a90424b248680c76'; + break; + case 'b65c3a85d16724d84a5eb0d2268629a6': + $term_value['search'] = 'agg__obj__titel'; + break; + default: + $term_value['search'] = 'all'; + } + + + } + /** * {@inheritdoc} */ @@ -287,18 +376,21 @@ class AdvancedSearchForm extends FormBase { // Either specified by the user in the request or use the default. $first = $i == 0; $term_value = !empty($term_values) ? array_shift($term_values) : $term_default_values; + $this->setSearchValue($term_value); $conjunction = $term_value[self::CONJUNCTION_FORM_FIELD] ?? $term_default_values[self::CONJUNCTION_FORM_FIELD]; $entity = $term_value[self::ENTITY_FORM_FIELD] ?? $term_default_values[self::ENTITY_FORM_FIELD]; + $search_field_options = isset(self::ENTITY_OPTIONS[$entity]) ? self::ENTITY_OPTIONS[$entity] : self::ENTITY_OPTIONS['ueberall']; $term_elements[] = [ // Only show on terms after the first. self::CONJUNCTION_FORM_FIELD => $first ? NULL : [ '#type' => 'select', '#attributes' => [ 'aria-label' => $this->t("Select search condition"), + 'class' => [$block_class_prefix . '--conjunction'], ], '#options' => [ self::AND_OP => $this->t('and'), - self::OR_OP => $this->t('or'), + #self::OR_OP => $this->t('or'), ], '#default_value' => $conjunction, '#theme_wrappers' => [], @@ -317,15 +409,23 @@ class AdvancedSearchForm extends FormBase { 'b65c3a85d16724d84a5eb0d2268629a6' => $this->t('Objekt'), ], '#default_value' => $entity, + '#ajax' => [ + 'callback' => [$this, 'ajaxCallback'], + 'wrapper' => self::AJAX_WRAPPER, + 'progress' => [ + 'type' => 'throbber', + ], + ], ], + self::SEARCH_FORM_FIELD => [ '#type' => 'select', '#attributes' => [ 'aria-label' => $this->t("Select search field"), 'class' => [$block_class_prefix . '--select-field'], ], - '#options' => $options, - '#default_value' => $term_value[self::SEARCH_FORM_FIELD], + '#options' => $search_field_options, + '#default_value' => $term_value['search'], '#theme_wrappers' => [], ], self::INCLUDE_FORM_FIELD => [ @@ -334,8 +434,8 @@ class AdvancedSearchForm extends FormBase { 'aria-label' => $this->t("Select search operator"), ], '#options' => [ - self::IS_OP => $this->t('is'), - self::NOT_OP => $this->t('is not'), + self::IS_OP => $this->t('contains'), + #self::NOT_OP => $this->t('contains not'), ], '#default_value' => $term_value[self::INCLUDE_FORM_FIELD], // Show only when conjunction is 'AND' as 'OR NOT' is not supported @@ -470,7 +570,32 @@ class AdvancedSearchForm extends FormBase { * Callback for adding / removing terms from the search. */ public function ajaxCallback(array &$form, FormStateInterface $form_state) { - return $form['ajax']; + // Get the triggering element. + $trigger = $form_state->getTriggeringElement(); + // Determine the term index from the triggering element's name. + if (preg_match('/terms\[(\d+)\]\[entity\]/', $trigger['#name'], $matches)) { + $term_index = $matches[1]; + // Reset the SEARCH_FORM_FIELD based on the new ENTITY_FORM_FIELD. + $options = $form['ajax']['terms'][$term_index][self::SEARCH_FORM_FIELD]['#options']; + $default_search_value = key($options); + $form_state->setValue(['ajax','terms', $term_index, self::SEARCH_FORM_FIELD], $default_search_value); + } + + $form_state->clearErrors(); + + return $form['ajax']; + } + + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state) { + // Only validate if the search button is pressed. + $trigger = $form_state->getTriggeringElement(); + if ($trigger['#value'] !== $this->t('Search')) { + $form_state->clearErrors(); + return; + } } /**