Modifications pour le document Solr Search Macros

Modifié par Florent Charton le 2026/03/13 11:04

Depuis la version 4.1
modifié par Florent Charton
sur 2026/01/13 15:01
Commentaire de modification : Install extension [org.xwiki.platform:xwiki-platform-search-solr-ui/17.10.2]
À la version 2.1
modifié par Florent Charton
sur 2024/08/08 18:44
Commentaire de modification : Install extension [org.xwiki.platform:xwiki-platform-search-solr-ui/15.10.11]

Résumé

Détails

Propriétés de la Page
Contenu
... ... @@ -4,11 +4,13 @@
4 4  #set ($rangePattern = $regextool.compile('^[\[{](.+) TO (.+)[\]}]$'))
5 5  #set ($wildcardPattern = $regextool.compile('^\(.*\*.*\)$'))
6 6  
7 -#macro (_displaySearchFormBegin)
7 +#macro (displaySearchForm)
8 8   #set($void = $services.progress.startStep('#displaySearchForm'))
9 9   {{html clean="false"}}
10 - <form class="search-form" action="$doc.getURL()" role="search">
10 + <form class="search-form row" action="$doc.getURL()" role="search">
11 11   <div class="hidden">
12 + <input type="hidden" name="sort" value="$!escapetool.xml($sort)"/>
13 + <input type="hidden" name="sortOrder" value="$!escapetool.xml($sortOrder)"/>
12 12   <input type="hidden" name="highlight" value="$highlightEnabled"/>
13 13   <input type="hidden" name="facet" value="$facetEnabled"/>
14 14   ## The parameter used to determine if the request has been redirected with default search filters.
... ... @@ -25,36 +25,26 @@
25 25   #end
26 26   #end
27 27   </div>
28 - <div class="search-bar">
30 + <div class="col-xs-12 col-sm-6">
29 29   <div class="input-group">
30 - <input id="search-page-bar-input" type="search" name="text" class="form-control"
31 - title="$escapetool.xml($services.localization.render('search.page.bar.query.title'))"
32 - placeholder="$escapetool.xml($services.localization.render('search.page.bar.query.title'))"
33 - value="$escapetool.xml($text)"/>
34 34   <label class='sr-only' for='search-page-bar-input'>
35 - $escapetool.xml($services.localization.render('search.page.bar.query.title'))
33 + $services.localization.render('search.page.bar.query.title')
36 36   </label>
35 + <input id='search-page-bar-input' type='search' name='text' class='form-control withTip useTitleAsTip'
36 + title="$services.localization.render('search.page.bar.query.title')" value="$escapetool.xml($text)"/>
37 37   <span class="input-group-btn">
38 38   <button type="submit" class="btn btn-primary">
39 39   $services.icon.renderHTML('search')
40 - <span>$escapetool.xml($services.localization.render('search.page.bar.submit'))</span>
40 + <span class="sr-only">$services.localization.render('search.page.bar.submit')</span>
41 41   </button>
42 42   </span>
43 43   </div>
44 44   </div>
45 + </form>
45 45   {{/html}}
46 46   #set($void = $services.progress.endStep())
47 47  #end
48 48  
49 -## We make sure the html block in this macro is not considered as inline to avoid generating extra `p` tags.
50 -#macro (_displaySearchFormEnd)
51 -
52 - {{html clean="false"}}
53 - </form>
54 - {{/html}}
55 -
56 -#end
57 -
58 58  #macro (displaySearchDebugInfo)
59 59   (% class="search-debug" %)(((
60 60   === Debug Information ===
... ... @@ -119,12 +119,12 @@
119 119   #end
120 120   #extendQueryString($url $resetParameters)
121 121   [[{{translation key="solr.facets.resetAll"}}>>path:$url
122 - ||class="search-facets-action-reset force-no-underline"]]## Continue in the same paragraph.
114 + ||class="search-facets-action-reset"]]## Continue in the same paragraph.
123 123   {{html clean="false"}}
124 - <a href="#" class="search-facets-action-collapseAll hidden force-no-underline">
116 + <a href="#" class="search-facets-action-collapseAll hidden">
125 125   $escapetool.xml($services.localization.render('solr.facets.collapseAll'))
126 126   </a>
127 - <a href="#" class="search-facets-action-expandAll hidden force-no-underline">
119 + <a href="#" class="search-facets-action-expandAll hidden">
128 128   $escapetool.xml($services.localization.render('solr.facets.expandAll'))
129 129   </a>
130 130   <span class="clearfloats"></span>
... ... @@ -190,12 +190,12 @@
190 190   #set ($facetPrettyName = $facetField.name)
191 191   #end
192 192   <div class="search-facet-header">
193 - <label>$escapetool.xml($facetPrettyName)
194 - <button class="btn btn-xs facet-toggle"
195 - aria-controls="$escapetool.xml($facetField.name)-dropdown">
185 + <span id="$escapetool.xml($facetField.name)-toggler-hint">$escapetool.xml($facetPrettyName)</span>
186 + <button class="btn btn-xs facet-toggler"
187 + aria-controls="$escapetool.xml($facetField.name)-dropdown"
188 + aria-labelledby="$escapetool.xml($facetField.name)-toggler-hint">
196 196   $services.icon.renderHTML('caret-down')
197 197   </button>
198 - </label>
199 199   </div>
200 200  #end
201 201  
... ... @@ -253,7 +253,7 @@
253 253   #displaySearchFacetValue($facetValue $customQueryStringParameters $customValueDisplayer false)
254 254  #end
255 255  
256 -#macro (displaySearchFacetValue $facetValue $customQueryStringParameters $customValueDisplayer $displayToggle)
248 +#macro (displaySearchFacetValue $facetValue $customQueryStringParameters $customValueDisplayer $displayToggler)
257 257   #set ($selectedValues = [])
258 258   #if ($facetRequestValues)
259 259   #set ($discard = $selectedValues.addAll($facetRequestValues.subList(0, $facetRequestValues.size())))
... ... @@ -268,8 +268,7 @@
268 268   #set ($discard = $queryStringParameters.putAll($customQueryStringParameters))
269 269   #end
270 270   #extendQueryString($url $queryStringParameters)
271 - <a href="$url" class="itemName#if ($selected) selected#end#if ($facetValue.name == '') empty#end"
272 - #if ($facetValue.name != '')data-facetvalue="$escapetool.xml($facetValue.name)"#end>
263 + <a href="$url" class="itemName#if ($selected) selected#end#if ($facetValue.name == '') empty#end">
273 273   #if ($facetValue.name == '')
274 274   #set ($facetPrettyValueKey = "solr.field.${facetField.name}.emptyValue")
275 275   #if (!$services.localization.get($facetPrettyValueKey))
... ... @@ -286,8 +286,8 @@
286 286   #end
287 287   </a>
288 288   <div class="itemCount">$facetValue.count</div>
289 - #if ($displayToggle)
290 - <button class="btn btn-xs facet-value-toggle">
280 + #if ($displayToggler)
281 + <button class="btn btn-xs facet-value-toggler">
291 291   <span class='sr-only'>$escapetool.xml($facetPrettyValue)</span>
292 292   $services.icon.renderHTML('caret-down')
293 293   </button>
... ... @@ -314,7 +314,7 @@
314 314   #end
315 315  #end
316 316  
317 -#macro (_displaySearchResultsControls)
308 +#macro (displaySearchResultsSort)
318 318   #set ($defaultSortOrder = $solrConfig.sortFields.get($type))
319 319   #if (!$defaultSortOrder)
320 320   #set ($defaultSortOrder = {'score': 'desc'})
... ... @@ -323,63 +323,28 @@
323 323   'asc': $services.icon.render('caret-up'),
324 324   'desc': $services.icon.render('caret-down')
325 325   })
326 - (% class='search-results-controls' %)
327 - (((
317 + (% class="search-options" %)
318 + * {{translation key="solr.options"/}}
319 + #if($highlightEnabled)#extendQueryString($url {'highlight': [false]})#else#extendQueryString($url {'highlight': [true]})#end
320 + * [[{{translation key="solr.options.highlight"/}}>>path:${url}||class="options-item#if($highlightEnabled) active#end" title="$services.localization.render('solr.options.highlight.title')"]]
321 + #if($facetEnabled)#extendQueryString($url {'facet': [false]})#else#extendQueryString($url {'facet': [true]})#end
322 + * [[{{translation key="solr.options.facet"/}}>>path:${url}||class="options-item#if($facetEnabled) active#end" title="$services.localization.render('solr.options.facet.title')"]]
328 328  
329 - {{html clean="false"}}
330 - <div class="search-results-sort">
331 - <label for="sort-by-input" class="sr-only">$escapetool.xml($services.localization.render('search.solr.sortBy.hint'))</label>##
332 - <select id="sort-by-input" name="sort">
333 - #foreach ($entry in $defaultSortOrder.entrySet())
334 - <option class="sort-item" value="$entry.key" #if($sort == $entry.key)selected='selected'#end>
335 - #set ($sortOptionNameList = $entry.key.split('_'))
336 - #set ($camelCasedSortOptionName = $sortOptionNameList.get(0))
337 - #foreach ($namePart in $sortOptionNameList.subList(1, $sortOptionNameList.size()))
338 - #set ($camelCasedSortOptionName = "${camelCasedSortOptionName}$stringtool.capitalize($namePart)")
339 - #end
340 - $escapetool.xml($services.localization.render("search.solr.sortBy.field.$camelCasedSortOptionName"))
341 - </option>
342 - #end
343 - </select>##
344 - <label class="form-control" title="$escapetool.xml($services.localization.render("search.solr.sortOrder.$sortOrder"))">##
345 - <input id="sort-order-input" type="checkbox" name="sortOrder" value="asc" #if ("$!sortOrder" == 'asc')checked="checked"#end/>##
346 - $services.icon.renderHTML('sort-descending')##
347 - $services.icon.renderHTML('sort-ascending')##
348 - <span class="sr-only">$escapetool.xml($services.localization.render("search.solr.sortOrder.$sortOrder"))</span>##
349 - </label>##
350 - </div>
351 - <div class="search-options">
352 - <ul>##
353 - <li>##
354 - <label>##
355 - <input id="option-highlight-input" type="checkbox" class="options-item" value="true"
356 - data-query-name="highlight"
357 - aria-describedby="option-highlight-description"
358 - title="$escapetool.xml($services.localization.render('solr.options.highlight.title'))"
359 - #if($highlightEnabled)checked#end/>##
360 - $escapetool.xml($services.localization.render('search.solr.options.showHighlight'))##
361 - </label>##
362 - <span id="option-highlight-description" class="sr-only">
363 - $escapetool.xml($services.localization.render('solr.options.highlight.title'))
364 - </span>##
365 - </li>##
366 - <li>##
367 - <label>##
368 - <input id="option-facet-input" type="checkbox" class="options-item" value="true" data-query-name="facet"
369 - aria-describedby="option-facet-description"
370 - title="$escapetool.xml($services.localization.render('solr.options.facet.title'))"
371 - #if($facetEnabled)checked#end/>##
372 - $escapetool.xml($services.localization.render('search.solr.options.showFacet'))
373 - </label>##
374 - <span id="option-facet-description" class="sr-only">
375 - $escapetool.xml($services.localization.render('solr.options.facet.title'))
376 - </span>##
377 - </li>##
378 - </ul>##
379 - </div>
380 - {{/html}}
381 -
382 - )))
324 + (% class="search-results-sort" %)
325 + * {{translation key="solr.sortBy"/}}
326 + #foreach ($entry in $defaultSortOrder.entrySet())
327 + #set ($class = 'sort-item')
328 + #set ($sortOrderIndicator = $NULL)
329 + #set ($targetSortOrder = $entry.value)
330 + #if ($sort == $entry.key)
331 + #set ($class = "$class active")
332 + #set ($sortOrderHint = $services.localization.render("solr.sortOrder.$sortOrder"))
333 + #set ($sortOrderIndicator = "(% class=""sort-item-order"" title=""$sortOrderHint"" %)$sortOrderSymbol.get($sortOrder)(%%)")
334 + #set ($targetSortOrder = "#if ($sortOrder == 'asc')desc#{else}asc#end")
335 + #end
336 + #extendQueryString($url {'sort': [$entry.key], 'sortOrder': [$targetSortOrder]})
337 + * [[{{translation key="solr.sortBy.$entry.key"/}}$!sortOrderIndicator>>path:${url}||class="$class"]]
338 + #end
383 383  #end
384 384  
385 385  #macro (extendQueryString $url $extraParameters)
... ... @@ -424,8 +424,7 @@
424 424   ## Add the parameters required to output the RSS feed instead of the search UI.
425 425   #set ($discard = $parameters.put('outputSyntax', 'plain'))
426 426   #set ($discard = $parameters.put('media', 'rss'))
427 - <a href="$doc.getURL('get', $escapetool.url($parameters))">
428 - $services.icon.renderHTML('rss')
383 + <a href="$doc.getURL('get', $escapetool.url($parameters))" class="hasIcon iconRSS">
429 429   $services.localization.render('search.rss', ["[$escapetool.xml($text)]"])
430 430   </a>
431 431   {{/html}}
... ... @@ -457,7 +457,7 @@
457 457   #displaySearchResultLocation()
458 458   <div class="search-result-author">
459 459   $services.localization.render('core.footer.modification', [
460 - "#displayUser($searchResult.author {'useInlineHTML': true})",
415 + "#displayUserProfileLink($searchResult.author $searchResult.author_display)",
461 461   $xwiki.formatDate($searchResult.date)
462 462   ])
463 463   </div>
... ... @@ -479,7 +479,7 @@
479 479   </h2>
480 480   #displaySearchResultLocation($searchResult)
481 481   <div class="search-result-uploader">
482 - #set ($uploader = "#displayUser($searchResult.attauthor.get(0) {'useInlineHTML': true})")
437 + #set ($uploader = "#displayUserProfileLink($searchResult.attauthor.get(0) $searchResult.attauthor_display.get(0))")
483 483   #set ($uploadDate = $xwiki.formatDate($searchResult.attdate.get(0)))
484 484   #set ($fileSize = "#dynamicsize($searchResult.attsize.get(0))")
485 485   $services.localization.render('solr.result.uploadedBy', [$uploader, $uploadDate, $fileSize])
... ... @@ -530,6 +530,15 @@
530 530   </div>
531 531  #end
532 532  
488 +#macro (displayUserProfileLink $userReference $userName)
489 +#if ($userReference)
490 +## We could test if the specified user exists but we want to speed up the search.
491 +<a href="$xwiki.getURL($userReference)">$escapetool.xml($userName)</a>##
492 +#else
493 +$services.localization.render('core.users.unknownUser')##
494 +#end
495 +#end
496 +
533 533  #macro (displaySearchResultHighlighting $searchResult)
534 534   #getSearchResultHighlighting($searchResult $highlighting)
535 535   #if ($highlighting.size() > 0)
... ... @@ -553,10 +553,12 @@
553 553   #end
554 554   </dl>
555 555   #if ($highlighting.size() > 1)
556 - <button class="search-result-highlightAll btn btn-xs btn-default hidden">
557 - $escapetool.xml($services.localization.render('solr.result.highlightAll'))
558 - $services.icon.renderHTML('right')
559 - </button>
520 + ## We wrap the link in a DIV because otherwise the HTML cleaning generates a paragraph.
521 + <div>
522 + <a href="#" class="search-result-highlightAll hidden">
523 + $escapetool.xml($services.localization.render('solr.result.highlightAll'))
524 + </a>
525 + </div>
560 560   #end
561 561   #end
562 562  #end
... ... @@ -628,10 +628,9 @@
628 628   ## Set query parameters.
629 629   #set ($discard = $query.setLimit($rows))
630 630   #set ($discard = $query.setOffset($start))
631 - #set ($discard = $query.addFilter('searchExclusions/solr'))
632 632   #set ($discard = $query.bindValue('sort', "${sort} ${sortOrder}"))
633 633   #set ($discard = $query.bindValue('tie', $solrConfig.tieBreaker))
634 - #set ($discard = $query.bindValue('mm', $solrConfig.minShouldMatch))
599 + #set ($discard = $query.bindValue('mm', $solrConfig.minShouldMatch))
635 635   #setQueryFields($query)
636 636   #setPhraseFields($query)
637 637   #setFacetFields($query)
... ... @@ -833,7 +833,10 @@
833 833   #end
834 834   ##
835 835   ## Pagination
836 - #getAndValidateQueryLimitFromRequest('rows', 10, $rows)
801 + #set ($rows = $numbertool.toNumber($request.rows).intValue())
802 + #if ("$!rows" == '')
803 + #set ($rows = 10)
804 + #end
837 837   #set ($start = $numbertool.toNumber($request.firstIndex).intValue())
838 838   #if ("$!start" == '')
839 839   #set ($start = 0)
... ... @@ -844,8 +844,6 @@
844 844   #if ("$!sort" == '')
845 845   #set ($sort = 'score')
846 846   #end
847 - ## If at any point this default behavior is changed, be extra careful with "#sort-order-input" initialization.
848 - ## We assume here that empty values are mapped to "desc" (meaning that we use "asc" as the checkbox value).
849 849   #set ($sortOrder = $request.sortOrder)
850 850   #if ("$!sortOrder" == '')
851 851   #set ($sortOrder = 'desc')
... ... @@ -887,15 +887,12 @@
887 887   {{/html}}
888 888  
889 889   #end
890 - #_displaySearchFormBegin()
856 + #displaySearchForm()
891 891   #if ($text != '')
892 892   #getSearchResults()
893 - #_displaySearchResultsControls()
894 - #_displaySearchFormEnd()
895 895   #if ($debug)
896 896   #displaySearchDebugInfo()
897 897   #end
898 -
899 899   (% class="search-results-container row" %)(((
900 900   #if ($facetEnabled)
901 901   (% class="col-xs-12 col-sm-4 col-sm-push-8 col-md-3 col-md-push-9" %)(((
... ... @@ -904,11 +904,11 @@
904 904   #end
905 905   (% class="search-results-left col-xs-12#if ($facetEnabled) col-sm-8 col-sm-pull-4 col-md-9 col-md-pull-3#end" %)
906 906   (((
870 + #displaySearchResultsSort()
871 +
907 907   #displaySearchResults()
908 908   )))
909 909   )))
910 - #else
911 - #_displaySearchFormEnd()
912 912   #end
913 913   )))
914 914   #set($void = $services.progress.popLevel())