From bdc53ce840b142892ae384d96e2257f84611b600 Mon Sep 17 00:00:00 2001 From: Roger Rehnelt Date: Sat, 3 Oct 2026 18:15:00 +0200 Subject: Produktfilter: Leiste mit Sortierung und Kategorie, einheitliche Abstände MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Leiste über den Produktkacheln hat Sortierung und im Sortiment eine Kategorieauswahl; Felder gleich hoch und auf einer Grundlinie, am Handy unter einem umrandeten Knopf mit Zahl der aktiven Filter. Ohne Treffer nennt der Hinweis den Filter. Co-Authored-By: Claude Opus 5.5 --- views/mods/mod_productview/productview.js | 36 ++++++++++++++++++ .../mods/mod_productview/productview_filter.phtml | 43 ++++++++++++++++++---- 2 files changed, 72 insertions(+), 7 deletions(-) (limited to 'views/mods') diff --git a/views/mods/mod_productview/productview.js b/views/mods/mod_productview/productview.js index fc58ec8..df33d92 100644 --- a/views/mods/mod_productview/productview.js +++ b/views/mods/mod_productview/productview.js @@ -175,6 +175,40 @@ } + // Zahl der aktiven Filter im Knopf „Filter“ und „Filter zurücksetzen“ der Leiste; der Filter bleibt beim Tauschen stehen + function updateBar( form ) { + + const badge = form.querySelector( '.wpsg-pvf__badge' ); + const reset = form.querySelector( '.wpsg-pvf__toggle .wpsg-pvf__reset' ); + if ( !badge && !reset ) return; + + const groups = {}; + + new FormData( form ).forEach( function( v, name ) { + + if ( v === '' ) return; + + const m = name.match( /^pvf\[(variants|attributs)\]\[(\d+)\]/ ); + + if ( name === 'pvc' ) groups.cat = true; + else if ( /^pvf\[price_(min|max)\]$/.test( name ) ) groups.price = true; + else if ( m ) groups[ m[ 1 ] + m[ 2 ] ] = true; + + } ); + + const n = Object.keys( groups ).length; + + if ( badge ) { + + badge.hidden = ( n === 0 ); + badge.querySelector( '.wpsg-pvf__badge-count' ).textContent = String( n ); + + } + + if ( reset ) reset.hidden = ( n === 0 ); + + } + function applyFilter() { const form = document.getElementById( 'wpsg_mod_productview_filter' ); @@ -194,6 +228,8 @@ boxes.forEach( function( box ) { refresh( box, { filter: values, page: 1 }, url, false ); } ); if ( lists.length ) refreshLists( lists, url ); + updateBar( form ); + history.pushState( { wpsgPv: true }, '', url ); return true; diff --git a/views/mods/mod_productview/productview_filter.phtml b/views/mods/mod_productview/productview_filter.phtml index 1cf98da..9341d53 100644 --- a/views/mods/mod_productview/productview_filter.phtml +++ b/views/mods/mod_productview/productview_filter.phtml @@ -25,16 +25,37 @@ - view['wpsg_mod_productview_filter']['bar']??false) === true); ?> + view['wpsg_mod_productview_filter']['bar']??false) === true); $nActive = intval($this->view['wpsg_mod_productview_filter']['active']??0); ?>
- + >,
view['showFilter'] as $filter) { ?> - + +
+ + +
+ + +
+ + +
+ +