From a6306de16168fab7179af0760dd51f520ecf4c4a Mon Sep 17 00:00:00 2001 From: bblaisATcoveo Date: Sun, 8 Feb 2026 16:41:06 -0500 Subject: [PATCH] Add notification triggers support --- src/connector.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/connector.js b/src/connector.js index d02d847..e3d5d0d 100644 --- a/src/connector.js +++ b/src/connector.js @@ -10,6 +10,7 @@ import { buildDidYouMean, buildContext, buildInteractiveResult, + buildNotifyTrigger, loadAdvancedSearchQueryActions, loadSortCriteriaActions, HighlightUtils, @@ -59,6 +60,7 @@ let querySummaryController; let didYouMeanController; let pagerController; let statusController; +let notifyTriggerController; let urlManager; let unsubscribeManager; let unsubscribeSearchBoxController; @@ -66,12 +68,14 @@ let unsubscribeResultListController; let unsubscribeQuerySummaryController; let unsubscribeDidYouMeanController; let unsubscribePagerController; +let unsubscribeNotifyTriggerController; // UI states let updateSearchBoxFromState = false; let searchBoxState; let resultListState; let querySummaryState; +let notificationState; let didYouMeanState; let pagerState; let lastCharKeyUp; @@ -89,6 +93,7 @@ let formElement = document.querySelector( `.page-type-search main [role=search], let resultsSection = document.querySelector( `#${resultSectionID}` ); let resultListElement = document.querySelector( '#result-list' ); let querySummaryElement = document.querySelector( '#query-summary' ); +let notificationTriggerElement = document.querySelector( '#notification-trigger' ); let pagerElement = document.querySelector( '#pager' ); let suggestionsElement = document.querySelector( '#suggestions' ); let didYouMeanElement = document.querySelector( '#did-you-mean' ); @@ -97,6 +102,7 @@ let didYouMeanElement = document.querySelector( '#did-you-mean' ); let resultTemplateHTML = document.getElementById( 'sr-single' )?.innerHTML; let noResultTemplateHTML = document.getElementById( 'sr-nores' )?.innerHTML; let resultErrorTemplateHTML = document.getElementById( 'sr-error' )?.innerHTML; +let notificationTriggerTemplateHTML = document.getElementById( 'sr-notification-trigger' )?.innerHTML; let querySummaryTemplateHTML = document.getElementById( 'sr-query-summary' )?.innerHTML; let didYouMeanTemplateHTML = document.getElementById( 'sr-did-you-mean' )?.innerHTML; let noQuerySummaryTemplateHTML = document.getElementById( 'sr-noquery-summary' )?.innerHTML; @@ -264,6 +270,17 @@ function initTpl() { } } + if ( !notificationTriggerTemplateHTML ) { + if ( lang === "fr" ) { + notificationTriggerTemplateHTML = + `
%[notification]
`; + } + else { + notificationTriggerTemplateHTML = + `
%[notification]
`; + } + } + if ( !querySummaryTemplateHTML ) { if ( lang === "fr" ) { querySummaryTemplateHTML = @@ -366,6 +383,14 @@ function initTpl() { resultsSection.id = resultSectionID; } + // auto-create notification trigger element + if ( !notificationTriggerElement ) { + notificationTriggerElement = document.createElement( "div" ); + notificationTriggerElement.id = "notification-trigger"; + + resultsSection.append( notificationTriggerElement ); + } + // auto-create query summary element if ( !querySummaryElement ) { querySummaryElement = document.createElement( "div" ); @@ -658,6 +683,7 @@ function initEngine() { didYouMeanController = buildDidYouMean( headlessEngine, { options: { automaticallyCorrectQuery: params.automaticallyCorrectQuery } } ); pagerController = buildPager( headlessEngine, { options: { numberOfPages: params.numberOfPages } } ); statusController = buildSearchStatus( headlessEngine ); + notifyTriggerController = buildNotifyTrigger( headlessEngine ); // Refine search based on URL parameters for filters, mostly used in Advanced Search to trigger only one search per page load if ( urlParams.allq || urlParams.exctq || urlParams.anyq || urlParams.noneq || urlParams.fqupdate || urlParams.dmn || urlParams.fqocct || urlParams.elctn_cat || urlParams.filetype || urlParams.site || urlParams.year || urlParams.declaredtype || urlParams.startdate || urlParams.enddate || urlParams.dprtmnt ) { @@ -892,6 +918,7 @@ function initEngine() { unsubscribeQuerySummaryController = querySummaryController.subscribe( () => updateQuerySummaryState( querySummaryController.state ) ); unsubscribeDidYouMeanController = didYouMeanController.subscribe( () => updateDidYouMeanState( didYouMeanController.state ) ); unsubscribePagerController = pagerController.subscribe( () => updatePagerState( pagerController.state ) ); + unsubscribeNotifyTriggerController = notifyTriggerController.subscribe( () => updateNotifyTriggerState( notifyTriggerController.state ) ); // Clear event tracking, for legacy browsers const onUnload = () => { @@ -902,6 +929,7 @@ function initEngine() { unsubscribeQuerySummaryController?.(); unsubscribeDidYouMeanController?.(); unsubscribePagerController?.(); + unsubscribeNotifyTriggerController?.(); }; // Listen to URL change (hash) @@ -1250,6 +1278,18 @@ function updateResultListState( newState ) { } } +// Update notification displayed +function updateNotifyTriggerState ( newState ) { + notificationState = newState; + + if ( notificationState.notifications?.length ) { + notificationTriggerElement.innerHTML = notificationTriggerTemplateHTML.replace( DOMPurify.sanitize( "%[notification]" ), notificationState.notifications[0] ); + } + else { + notificationTriggerElement.textContent = ""; + } +} + // Update heading that has number of results displayed (Query Summary) function updateQuerySummaryState( newState ) { querySummaryState = newState;