Problem/Motivation

Facets 3 introduced facets_exposed_filters. For numeric exposed filters, there is currently no dedicated range-slider processor/widget integration that supports:

  • min/max range normalization for exposed input
  • range boundary calculation from facet results
  • Better Exposed Filters slider UI with optional snap-to-available-values
  • Solr-specific handling to avoid self-filtered min/max boundaries

Steps to reproduce

  1. Create a Search API view with a numeric exposed facet filter.
  2. Try to configure it as a range-slider-style exposed filter (BEF).
  3. Observe that there is no dedicated exposed-range-slider processor/widget flow in facets_exposed_filters.

Proposed resolution

  • Add new processor plugin: exposed_range_slider in facets_exposed_filters.
  • Add new BEF widget plugin: facets_exposed_range_slider.
  • Add dedicated JS behavior/library for exposed range sliders.
  • Extend config schema for processor + BEF widget settings.
  • Update hook implementation to:
    • store raw facet results for snap-value extraction
    • force OR operator for Solr when exposed range slider processor is enabled (to prevent self-filtered boundaries)
  • Adjust FacetsFilter active-item handling so exposed min/max survives pre-query normalization and rebuilds.

User interface changes

  • New processor option: Exposed range slider in facet filter extra options.
  • New BEF filter widget: Exposed facet range slider.
  • Optional BEF setting: Snap to available facet values.

API changes

  • New plugin ID: exposed_range_slider (facets processor).
  • New plugin ID: facets_exposed_range_slider (BEF filter widget).
  • New schema entries for these plugin configurations.

Release notes snippet

Facets exposed filters now support a dedicated numeric range slider integration (processor + BEF widget), including optional snap-to-values behavior and improved Solr boundary handling.

CommentFileSizeAuthor
#6 3589695-exposed-range-slider-6.patch46.83 KBjonasanne

Issue fork facets-3589695

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

danielehrenhofer created an issue. See original summary.

danielehrenhofer’s picture

danielehrenhofer’s picture

Status: Active » Needs review
danielehrenhofer’s picture

jonasanne’s picture

StatusFileSize
new46.83 KB

I rerolled the patch against 3.0.3 since the diff no longer applies.
I tested this, and it looks like it's working.

danielehrenhofer’s picture

Added a follow-up commit for Views Filters Summary integration.

The exposed range slider is now handled as one semantic range summary item instead of separate facet values. The summary uses the active exposed min/max input, respects the BEF tooltip value prefix/suffix configuration, and sets raw to min|max so the existing Views Filters Summary remove-link handling resets both range inputs.

mkalkbrenner’s picture

Status: Needs review » Needs work
******************************************************************************************
Now running ESLint using the --fix option. Any errors shown below are not fixable automatically. 
******************************************************************************************
$ $CI_PROJECT_DIR/$_WEB_ROOT/core/node_modules/.bin/eslint --no-error-on-unmatched-pattern --ignore-pattern="*.es6.js" --resolve-plugins-relative-to=$CI_PROJECT_DIR/$_WEB_ROOT/core --ext=.js,.yml $_ESLINT_EXTRA --fix . || EXIT_CODE_FIX=$?
/builds/issue/facets-3589695/web/modules/custom/facets/modules/facets_exposed_filters/js/exposed-range-slider.js
   50:46  error  'getDatasetOptions' was used before it was defined        no-use-before-define
   66:28  error  'normalizeSnapValues' was used before it was defined      no-use-before-define
   68:11  error  'toBoolean' was used before it was defined                no-use-before-define
   79:29  error  'getPrecision' was used before it was defined             no-use-before-define
   80:51  error  'parseInput' was used before it was defined               no-use-before-define
   83:31  error  'formatValue' was used before it was defined              no-use-before-define
  103:15  error  'getPrecision' was used before it was defined             no-use-before-define
  104:15  error  'getValuesPrecision' was used before it was defined       no-use-before-define
  106:13  error  'getPrecision' was used before it was defined             no-use-before-define
  108:28  error  'normalizeStartValue' was used before it was defined      no-use-before-define
  109:11  error  'parseInput' was used before it was defined               no-use-before-define
  115:28  error  'normalizeStartValue' was used before it was defined      no-use-before-define
  116:11  error  'parseInput' was used before it was defined               no-use-before-define
  124:61  error  'formatValue' was used before it was defined              no-use-before-define
  134:28  error  'buildSnapRange' was used before it was defined           no-use-before-define
  143:22  error  'formatValue' was used before it was defined              no-use-before-define
  178:13  error  'isDefaultRange' was used before it was defined           no-use-before-define
  193:11  error  'clearDefaultRangeInputs' was used before it was defined  no-use-before-define
  194:11  error  'pruneAjaxUrl' was used before it was defined             no-use-before-define
  194:32  error  'getRangeInputNames' was used before it was defined       no-use-before-define
  199:11  error  'updateHandle' was used before it was defined             no-use-before-define
  203:11  error  'updateHandle' was used before it was defined             no-use-before-define
  305:15  error  'parseInput' was used before it was defined               no-use-before-define
  315:11  error  'isDefaultRange' was used before it was defined           no-use-before-define
  315:60  error  'getPrecision' was used before it was defined             no-use-before-define
  365:18  error  'removeQueryParameters' was used before it was defined    no-use-before-define
  369:26  error  'removeQueryParameters' was used before it was defined    no-use-before-define
  454:15  error  'findClosestValue' was used before it was defined         no-use-before-define
  510:12  error  'findClosestValue' was used before it was defined         no-use-before-define
  527:25  error  Do not nest ternary expressions                           no-nested-ternary
  588:34  error  'getPrecision' was used before it was defined             no-use-before-define
✖ 31 problems (31 errors, 0 warnings)
danielehrenhofer’s picture

Status: Needs work » Needs review

mkalkbrenner’s picture

Status: Needs review » Fixed

Now that this issue is closed, review the contribution record.

As a contributor, attribute any organization that helped you, or if you volunteered your own time.

Maintainers, credit people who helped resolve this issue.

danielehrenhofer’s picture

Assigned: danielehrenhofer » Unassigned
ressa’s picture

Thanks for this great improvement @danielehrenhofer. Perhaps it could be considered to add a new "Available facets" page on https://project.pages.drupalcode.org/facets/, where the "Range slider" and all the other currently available facets could be listed? Planned facets, or those under way could also be listed under a "Planned Facets" section.

EDIT: I created #3593043: Add Available facets page in documentation.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.