Skip to content

Commit 67e71d4

Browse files
authored
Merge pull request #72 from searchcraft-inc/development
Version 1.3.7 release
2 parents a1be13e + 1af34f7 commit 67e71d4

File tree

69 files changed

+3518
-2529
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+3518
-2529
lines changed

admin/class-searchcraft-admin.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,8 +1034,11 @@ private function searchcraft_on_layout_settings_config_request( $request ) {
10341034
if ( isset( $request['searchcraft_search_experience'] ) ) {
10351035
$experience = sanitize_text_field( wp_unslash( $request['searchcraft_search_experience'] ) );
10361036

1037-
// Validate the experience value.
1038-
$valid_experiences = array( 'full', 'popover' );
1037+
// Validate the experience value. Map legacy 'popover' to 'modal'.
1038+
if ( 'popover' === $experience ) {
1039+
$experience = 'modal';
1040+
}
1041+
$valid_experiences = array( 'full', 'modal', 'inline' );
10391042
if ( ! in_array( $experience, $valid_experiences, true ) ) {
10401043
$experience = 'full';
10411044
}
@@ -1485,6 +1488,30 @@ private function searchcraft_on_layout_settings_config_request( $request ) {
14851488
update_option( 'searchcraft_popover_element_behavior', $popover_element_behavior );
14861489
}
14871490

1491+
// Handle enable view all results setting.
1492+
$enable_view_all_results = isset( $request['searchcraft_enable_view_all_results'] ) ? true : false;
1493+
update_option( 'searchcraft_enable_view_all_results', $enable_view_all_results );
1494+
1495+
// Handle view all results label.
1496+
if ( isset( $request['searchcraft_view_all_results_label'] ) ) {
1497+
$view_all_results_label = sanitize_text_field( wp_unslash( $request['searchcraft_view_all_results_label'] ) );
1498+
update_option( 'searchcraft_view_all_results_label', $view_all_results_label );
1499+
}
1500+
1501+
// Handle overlay results per page setting.
1502+
if ( isset( $request['searchcraft_overlay_results_per_page'] ) ) {
1503+
$overlay_results_per_page = absint( wp_unslash( $request['searchcraft_overlay_results_per_page'] ) );
1504+
1505+
// Validate the overlay results per page value (between 1 and 20).
1506+
if ( $overlay_results_per_page < 1 ) {
1507+
$overlay_results_per_page = 1;
1508+
} elseif ( $overlay_results_per_page > 20 ) {
1509+
$overlay_results_per_page = 20;
1510+
}
1511+
1512+
update_option( 'searchcraft_overlay_results_per_page', $overlay_results_per_page );
1513+
}
1514+
14881515
// Handle retain get_search_form setting.
14891516
$retain_get_search_form = isset( $request['searchcraft_retain_get_search_form'] ) ? true : false;
14901517
update_option( 'searchcraft_retain_get_search_form', $retain_get_search_form );

admin/js/searchcraft-admin.js

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,27 @@ function toggleFormFields() {
114114
row.classList.toggle('hidden', !isFullSelected);
115115
});
116116

117-
// Show/hide popover fields
117+
// Show/hide popover fields (modal and inline are both popover variants)
118118
popoverOnlyRows.forEach((row) => {
119119
row.classList.toggle('hidden', isFullSelected);
120120
});
121121
}
122122

123+
/**
124+
* Toggle view all label row visibility based on checkbox state
125+
*/
126+
function toggleViewAllLabelRow() {
127+
const checkbox = document.getElementById('searchcraft_enable_view_all_results');
128+
const labelRows = document.querySelectorAll('.searchcraft-view-all-label-row');
129+
if (!checkbox || !labelRows.length) {
130+
return;
131+
}
132+
const isChecked = checkbox.checked;
133+
labelRows.forEach((row) => {
134+
row.style.display = isChecked ? '' : 'none';
135+
});
136+
}
137+
123138
/**
124139
* Toggle filter panel options visibility
125140
*/
@@ -647,32 +662,28 @@ function updateFilterPanelOrder() {
647662
}
648663

649664
document.addEventListener('DOMContentLoaded', () => {
650-
// Initialize color pickers
651665
initColorPickers();
652-
653-
// Initialize password toggle functionality
654666
initPasswordToggle();
655-
656-
// Initialize button with spinner functionality
657667
initButtonWithSpinner();
658-
659-
// Initialize custom post type checkboxes
660668
initCustomPostTypeCheckboxes();
661-
662-
// Initialize excerpt override inputs with datalist
663669
initExcerptOverrideInputs();
664670

665671
// layout tab functionality
666672
if (document.querySelector('.searchcraft-layout')) {
667-
const fullRadio = document.querySelector('input[name="searchcraft_search_experience"][value="full"]');
668-
const popoverRadio = document.querySelector('input[name="searchcraft_search_experience"][value="popover"]');
673+
// Search behavior toggle for input container description
674+
const onPageRadio = document.querySelector('input[name="searchcraft_search_behavior"][value="on_page"]');
675+
const standAloneRadio = document.querySelector('input[name="searchcraft_search_behavior"][value="stand_alone"]');
669676

670677
// Initial state
671678
toggleFormFields();
679+
updateSearchInputContainerDescription();
672680

673-
// Add event listeners
674-
fullRadio?.addEventListener('change', toggleFormFields);
675-
popoverRadio?.addEventListener('change', toggleFormFields);
681+
// Add event listeners for all three experience radio buttons
682+
document.querySelectorAll('input[name="searchcraft_search_experience"]').forEach((radio) => {
683+
radio.addEventListener('change', toggleFormFields);
684+
});
685+
onPageRadio?.addEventListener('change', updateSearchInputContainerDescription);
686+
standAloneRadio?.addEventListener('change', updateSearchInputContainerDescription);
676687

677688
// Filter panel options toggle
678689
const filterPanelCheckbox = document.getElementById('searchcraft_include_filter_panel');
@@ -684,20 +695,9 @@ document.addEventListener('DOMContentLoaded', () => {
684695
filterPanelCheckbox.addEventListener('change', toggleFilterPanelOptions);
685696
}
686697

687-
// Search behavior toggle for input container description
688-
const onPageRadio = document.querySelector('input[name="searchcraft_search_behavior"][value="on_page"]');
689-
const standAloneRadio = document.querySelector('input[name="searchcraft_search_behavior"][value="stand_alone"]');
690-
691698
// Initialize container ID tag UI
692699
initContainerIdTagUI();
693700

694-
// Initial state
695-
updateSearchInputContainerDescription();
696-
697-
// Add event listeners
698-
onPageRadio?.addEventListener('change', updateSearchInputContainerDescription);
699-
standAloneRadio?.addEventListener('change', updateSearchInputContainerDescription);
700-
701701
// Facets options toggle
702702
const facetsCheckbox = document.getElementById('searchcraft_enable_facets');
703703
if (facetsCheckbox) {
@@ -708,6 +708,16 @@ document.addEventListener('DOMContentLoaded', () => {
708708
facetsCheckbox.addEventListener('change', toggleFacetsOptions);
709709
}
710710

711+
// View all label row toggle
712+
const viewAllCheckbox = document.getElementById('searchcraft_enable_view_all_results');
713+
if (viewAllCheckbox) {
714+
// Initial state
715+
toggleViewAllLabelRow();
716+
717+
// Add event listener
718+
viewAllCheckbox.addEventListener('change', toggleViewAllLabelRow);
719+
}
720+
711721
// AI summary banner text toggle
712722
const aiSummaryCheckbox = document.getElementById('searchcraft_enable_ai_summary');
713723
if (aiSummaryCheckbox) {

admin/partials/searchcraft-admin-layout-tab.php

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
$search_experience = get_option( 'searchcraft_search_experience', 'full' );
3636
$include_filter_panel = get_option( 'searchcraft_include_filter_panel', false );
3737
$results_per_page = get_option( 'searchcraft_results_per_page', 10 );
38+
$overlay_results_per_page = get_option( 'searchcraft_overlay_results_per_page', 5 );
3839
$enable_most_recent_toggle = get_option( 'searchcraft_enable_most_recent_toggle', '1' );
3940
$enable_exact_match_toggle = get_option( 'searchcraft_enable_exact_match_toggle', '1' );
4041
$enable_date_range = get_option( 'searchcraft_enable_date_range', '1' );
@@ -89,6 +90,10 @@
8990
<td>
9091
<?php
9192
$search_experience = get_option( 'searchcraft_search_experience', 'full' );
93+
// Legacy: treat old 'popover' value as 'modal'.
94+
if ( 'popover' === $search_experience ) {
95+
$search_experience = 'modal';
96+
}
9297
?>
9398
<fieldset>
9499
<legend class="screen-reader-text"><span>Search Experience Type</span></legend>
@@ -98,12 +103,17 @@
98103
</label>
99104
<br><br>
100105
<label>
101-
<input type="radio" name="searchcraft_search_experience" value="popover" <?php checked( $search_experience, 'popover' ); ?> />
102-
<strong>Popover</strong> - Compact search overlay that appears on demand
106+
<input type="radio" name="searchcraft_search_experience" value="modal" <?php checked( $search_experience, 'modal' ); ?> />
107+
<strong>Modal</strong> - Compact search overlay triggered by a search button, appearing in a modal
108+
</label>
109+
<br><br>
110+
<label>
111+
<input type="radio" name="searchcraft_search_experience" value="inline" <?php checked( $search_experience, 'inline' ); ?> />
112+
<strong>Inline</strong> - Renders inline on the page, with results appearing as an overlay below
103113
</label>
104114
</fieldset>
105115
<p class="description">
106-
Choose how you want search to be presented to your users. The full experience provides deep filtering controls while the popover offers a simple, single input experience.
116+
Choose how you want search to be presented to your users. The full experience provides deep filtering controls, while Modal and Inline offer a compact popover experience.
107117
</p>
108118
</td>
109119
</tr>
@@ -233,6 +243,55 @@
233243
</p>
234244
</td>
235245
</tr>
246+
<tr class="searchcraft-popover-only">
247+
<th scope="row">
248+
<label for="searchcraft_enable_view_all_results">Enable View All Results</label>
249+
</th>
250+
<td>
251+
<label for="searchcraft_enable_view_all_results">
252+
<input
253+
type="checkbox"
254+
name="searchcraft_enable_view_all_results"
255+
id="searchcraft_enable_view_all_results"
256+
value="1"
257+
<?php checked( get_option( 'searchcraft_enable_view_all_results', false ), true ); ?>
258+
/>
259+
Enable a &ldquo;View All Results&rdquo; link in the popover search form.
260+
</label>
261+
<p class="description">
262+
When enabled, a link will appear in the search form directing users to the full search results page.
263+
</p>
264+
</td>
265+
</tr>
266+
<tr class="searchcraft-popover-only searchcraft-view-all-label-row">
267+
<th scope="row">
268+
<label for="searchcraft_view_all_results_label">View All Label</label>
269+
</th>
270+
<td>
271+
<?php
272+
$view_all_results_label = get_option( 'searchcraft_view_all_results_label', '' );
273+
?>
274+
<input type="text" name="searchcraft_view_all_results_label" id="searchcraft_view_all_results_label" value="<?php echo esc_attr( $view_all_results_label ); ?>" class="regular-text" placeholder="View All" />
275+
<p class="description">
276+
The label text for the &ldquo;View All Results&rdquo; link.
277+
</p>
278+
</td>
279+
</tr>
280+
<tr class="searchcraft-popover-only">
281+
<th scope="row">
282+
<label for="searchcraft_overlay_results_per_page">Results in Overlay</label>
283+
</th>
284+
<td>
285+
<select name="searchcraft_overlay_results_per_page" id="searchcraft_overlay_results_per_page" class="regular-text">
286+
<?php for ( $i = 1; $i <= 20; $i++ ) : ?>
287+
<option value="<?php echo esc_attr( $i ); ?>" <?php selected( $overlay_results_per_page, $i ); ?>><?php echo esc_html( $i ); ?></option>
288+
<?php endfor; ?>
289+
</select>
290+
<p class="description">
291+
Number of search results to display in the modal or inline overlay. Default is 5 results.
292+
</p>
293+
</td>
294+
</tr>
236295
</tbody>
237296
</table>
238297
</div>

public/class-searchcraft-public.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,8 @@ public function get_js_config() {
302302
$oldest_post_year = $admin_instance->get_oldest_post_year();
303303
$js_config['oldestPostYear'] = $oldest_post_year;
304304

305-
$js_config['resultsPerPage'] = intval( get_option( 'searchcraft_results_per_page', 10 ) );
305+
$js_config['resultsPerPage'] = intval( get_option( 'searchcraft_results_per_page', 10 ) );
306+
$js_config['overlayResultsPerPage'] = intval( get_option( 'searchcraft_overlay_results_per_page', 5 ) );
306307

307308
// Filter taxonomies.
308309
$filter_taxonomies = get_option( 'searchcraft_filter_taxonomies', array() );
@@ -387,6 +388,7 @@ private function prepare_script_data() {
387388
'resultsContainerId' => $results_container_id,
388389
'popoverContainerId' => $popover_container_id,
389390
'popoverInsertBehavior' => $popover_insert_behavior,
391+
'isSearchPage' => is_search(),
390392
);
391393
}
392394

public/js/searchcraft-sdk-integration.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,21 @@
6767
return;
6868
}
6969
const isWPSearchPage = searchcraft_config.isWPSearchPage || false;
70+
71+
// Determine which results per page setting to use
72+
// Use overlayResultsPerPage for modal/inline when NOT on search page
73+
// Use regular resultsPerPage for full experience or when on search page
74+
let resultsPerPage = parseInt(searchcraft_config.resultsPerPage) || 10;
75+
if (!isWPSearchPage && searchcraft_config.overlayResultsPerPage) {
76+
resultsPerPage = parseInt(searchcraft_config.overlayResultsPerPage) || 5;
77+
}
78+
7079
const config = {
7180
indexName: searchcraft_config.indexName,
7281
readKey: searchcraft_config.readKey,
7382
endpointURL: searchcraft_config.endpointURL,
7483
searchDebounceDelay: 50,
75-
searchResultsPerPage: parseInt(searchcraft_config.resultsPerPage) || 10
84+
searchResultsPerPage: resultsPerPage
7685
};
7786

7887
// Add cortexURL if AI summary is enabled

public/js/searchcraft-sdk-settings.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,31 @@
3636

3737
templatesInjected = true;
3838

39-
// Handle full experience or popover with no container specified
40-
if (settings.searchExperience === 'full' ||
41-
(settings.searchExperience === 'popover' && !settings.popoverContainerId)) {
39+
const isPopover = settings.searchExperience === 'modal' || settings.searchExperience === 'inline'
40+
// Legacy support for old 'popover' value.
41+
|| settings.searchExperience === 'popover';
42+
43+
const isSearchPage = settings.isSearchPage == 1;
44+
// On search page with modal/inline, always inject full header + results
45+
if (isSearchPage && isPopover) {
4246
injectSearchHeader(settings.headerContent, settings.inputContainerId);
43-
// Inject results content for full experience
44-
if (settings.searchExperience === 'full' && settings.resultsContent) {
47+
if (settings.resultsContent) {
4548
injectSearchResults(settings.resultsContent, settings.resultsContainerId);
4649
}
4750
}
51+
// Handle full experience
52+
else if (settings.searchExperience === 'full') {
53+
injectSearchHeader(settings.headerContent, settings.inputContainerId);
54+
if (settings.resultsContent) {
55+
injectSearchResults(settings.resultsContent, settings.resultsContainerId);
56+
}
57+
}
58+
// Handle popover with no container specified
59+
else if (isPopover && !settings.popoverContainerId) {
60+
injectSearchHeader(settings.headerContent, settings.inputContainerId);
61+
}
4862
// Handle popover with specific container
49-
else if (settings.searchExperience === 'popover' && settings.popoverContainerId) {
63+
else if (isPopover && settings.popoverContainerId) {
5064
injectPopoverContent(
5165
settings.headerContent,
5266
settings.popoverContainerId,

public/sdk/components/defineCustomElements.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
import { defineCustomElement as define_searchcraft_ad } from './searchcraft-ad.js?v=0.13.3';
2-
import { defineCustomElement as define_searchcraft_button } from './searchcraft-button.js?v=0.13.3';
3-
import { defineCustomElement as define_searchcraft_error_message } from './searchcraft-error-message.js?v=0.13.3';
4-
import { defineCustomElement as define_searchcraft_facet_list } from './searchcraft-facet-list.js?v=0.13.3';
5-
import { defineCustomElement as define_searchcraft_filter_panel } from './searchcraft-filter-panel.js?v=0.13.3';
6-
import { defineCustomElement as define_searchcraft_input_form } from './searchcraft-input-form.js?v=0.13.3';
7-
import { defineCustomElement as define_searchcraft_input_label } from './searchcraft-input-label.js?v=0.13.3';
8-
import { defineCustomElement as define_searchcraft_loading } from './searchcraft-loading.js?v=0.13.3';
9-
import { defineCustomElement as define_searchcraft_pagination } from './searchcraft-pagination.js?v=0.13.3';
10-
import { defineCustomElement as define_searchcraft_popover_button } from './searchcraft-popover-button.js?v=0.13.3';
11-
import { defineCustomElement as define_searchcraft_popover_footer } from './searchcraft-popover-footer.js?v=0.13.3';
12-
import { defineCustomElement as define_searchcraft_popover_form } from './searchcraft-popover-form.js?v=0.13.3';
13-
import { defineCustomElement as define_searchcraft_popover_list_item } from './searchcraft-popover-list-item.js?v=0.13.3';
14-
import { defineCustomElement as define_searchcraft_popover_list_view } from './searchcraft-popover-list-view.js?v=0.13.3';
15-
import { defineCustomElement as define_searchcraft_results_info } from './searchcraft-results-info.js?v=0.13.3';
16-
import { defineCustomElement as define_searchcraft_search_result } from './searchcraft-search-result.js?v=0.13.3';
17-
import { defineCustomElement as define_searchcraft_search_results_per_page } from './searchcraft-search-results-per-page.js?v=0.13.3';
18-
import { defineCustomElement as define_searchcraft_search_results } from './searchcraft-search-results.js?v=0.13.3';
19-
import { defineCustomElement as define_searchcraft_select } from './searchcraft-select.js?v=0.13.3';
20-
import { defineCustomElement as define_searchcraft_slider } from './searchcraft-slider.js?v=0.13.3';
21-
import { defineCustomElement as define_searchcraft_summary_box } from './searchcraft-summary-box.js?v=0.13.3';
22-
import { defineCustomElement as define_searchcraft_theme } from './searchcraft-theme.js?v=0.13.3';
23-
import { defineCustomElement as define_searchcraft_toggle_button } from './searchcraft-toggle-button.js?v=0.13.3';
1+
import { defineCustomElement as define_searchcraft_ad } from './searchcraft-ad.js?scv=0.14.0';
2+
import { defineCustomElement as define_searchcraft_button } from './searchcraft-button.js?scv=0.14.0';
3+
import { defineCustomElement as define_searchcraft_error_message } from './searchcraft-error-message.js?scv=0.14.0';
4+
import { defineCustomElement as define_searchcraft_facet_list } from './searchcraft-facet-list.js?scv=0.14.0';
5+
import { defineCustomElement as define_searchcraft_filter_panel } from './searchcraft-filter-panel.js?scv=0.14.0';
6+
import { defineCustomElement as define_searchcraft_input_form } from './searchcraft-input-form.js?scv=0.14.0';
7+
import { defineCustomElement as define_searchcraft_input_label } from './searchcraft-input-label.js?scv=0.14.0';
8+
import { defineCustomElement as define_searchcraft_loading } from './searchcraft-loading.js?scv=0.14.0';
9+
import { defineCustomElement as define_searchcraft_pagination } from './searchcraft-pagination.js?scv=0.14.0';
10+
import { defineCustomElement as define_searchcraft_popover_button } from './searchcraft-popover-button.js?scv=0.14.0';
11+
import { defineCustomElement as define_searchcraft_popover_footer } from './searchcraft-popover-footer.js?scv=0.14.0';
12+
import { defineCustomElement as define_searchcraft_popover_form } from './searchcraft-popover-form.js?scv=0.14.0';
13+
import { defineCustomElement as define_searchcraft_popover_list_item } from './searchcraft-popover-list-item.js?scv=0.14.0';
14+
import { defineCustomElement as define_searchcraft_popover_list_view } from './searchcraft-popover-list-view.js?scv=0.14.0';
15+
import { defineCustomElement as define_searchcraft_results_info } from './searchcraft-results-info.js?scv=0.14.0';
16+
import { defineCustomElement as define_searchcraft_search_result } from './searchcraft-search-result.js?scv=0.14.0';
17+
import { defineCustomElement as define_searchcraft_search_results_per_page } from './searchcraft-search-results-per-page.js?scv=0.14.0';
18+
import { defineCustomElement as define_searchcraft_search_results } from './searchcraft-search-results.js?scv=0.14.0';
19+
import { defineCustomElement as define_searchcraft_select } from './searchcraft-select.js?scv=0.14.0';
20+
import { defineCustomElement as define_searchcraft_slider } from './searchcraft-slider.js?scv=0.14.0';
21+
import { defineCustomElement as define_searchcraft_summary_box } from './searchcraft-summary-box.js?scv=0.14.0';
22+
import { defineCustomElement as define_searchcraft_theme } from './searchcraft-theme.js?scv=0.14.0';
23+
import { defineCustomElement as define_searchcraft_toggle_button } from './searchcraft-toggle-button.js?scv=0.14.0';
2424

2525
export const defineCustomElements = () => {
2626
define_searchcraft_ad();

0 commit comments

Comments
 (0)