From 573d5c12e52811386b9c8690a319f8d273b7a1e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Mummert?= Date: Mon, 23 Feb 2026 20:28:50 +0100 Subject: [PATCH] Configure Tom Select placeholders and sortable options --- .../templates/frontend/event_filter.html.twig | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/contao/templates/frontend/event_filter.html.twig b/contao/templates/frontend/event_filter.html.twig index 3a695a2..950eb1f 100644 --- a/contao/templates/frontend/event_filter.html.twig +++ b/contao/templates/frontend/event_filter.html.twig @@ -2,8 +2,8 @@
- + {% for tag in tagButtons|default([]) %} {% endfor %} @@ -12,8 +12,8 @@
- + {% for location in locations|default([]) %} {% endfor %} @@ -22,8 +22,8 @@
- + {% for organization in organizations|default([]) %} {% endfor %} @@ -115,7 +115,7 @@ const animationMs = 220; let hideTimers = new WeakMap(); - let currentFilter = { type: 'all', value: 'all' }; + let currentFilter = { type: 'all', value: '' }; let suppressedChangeEvents = 0; const initTomSelect = (selectElement) => { @@ -123,7 +123,13 @@ return null; } - return new window.TomSelect(selectElement); + return new window.TomSelect(selectElement, { + create: true, + sortField: { + field: 'text', + direction: 'asc', + }, + }); }; const tagTom = initTomSelect(tagSelect); @@ -185,9 +191,9 @@ }; const setActiveControl = ({ type, value }) => { - const hasActiveTag = type === 'tag' && value !== 'all'; - const hasActiveLocation = type === 'location' && value !== 'all'; - const hasActiveOrg = type === 'org' && value !== 'all'; + const hasActiveTag = type === 'tag' && Boolean(value); + const hasActiveLocation = type === 'location' && Boolean(value); + const hasActiveOrg = type === 'org' && Boolean(value); tagWidget?.classList.toggle('active', hasActiveTag); locationWidget?.classList.toggle('active', hasActiveLocation); @@ -204,7 +210,7 @@ .filter(Boolean); const matches = (eventItem, filterState) => { - if (filterState.value === 'all') { + if (!filterState.value || filterState.type === 'all') { return true; } @@ -220,10 +226,6 @@ return parseIdList(eventItem.dataset.org).includes(filterState.value); } - if (filterState.type === 'all') { - return true; - } - return true; }; @@ -275,12 +277,12 @@ const selectedValue = tagSelect.value; - setSelectValue(locationSelect, locationTom, 'all'); - setSelectValue(orgSelect, orgTom, 'all'); + setSelectValue(locationSelect, locationTom, ''); + setSelectValue(orgSelect, orgTom, ''); applyFilter( - selectedValue === 'all' - ? { type: 'all', value: 'all' } + !selectedValue + ? { type: 'all', value: '' } : { type: 'tag', value: selectedValue.replace('tag-', '') }, ); }); @@ -292,12 +294,12 @@ const selectedValue = locationSelect.value; - setSelectValue(tagSelect, tagTom, 'all'); - setSelectValue(orgSelect, orgTom, 'all'); + setSelectValue(tagSelect, tagTom, ''); + setSelectValue(orgSelect, orgTom, ''); applyFilter( - selectedValue === 'all' - ? { type: 'all', value: 'all' } + !selectedValue + ? { type: 'all', value: '' } : { type: 'location', value: selectedValue.replace('location-', '') }, ); }); @@ -309,22 +311,22 @@ const selectedValue = orgSelect.value; - setSelectValue(tagSelect, tagTom, 'all'); - setSelectValue(locationSelect, locationTom, 'all'); + setSelectValue(tagSelect, tagTom, ''); + setSelectValue(locationSelect, locationTom, ''); applyFilter( - selectedValue === 'all' - ? { type: 'all', value: 'all' } + !selectedValue + ? { type: 'all', value: '' } : { type: 'org', value: selectedValue.replace('org-', '') }, ); }); resetButton?.addEventListener('click', () => { - setSelectValue(tagSelect, tagTom, 'all'); - setSelectValue(locationSelect, locationTom, 'all'); - setSelectValue(orgSelect, orgTom, 'all'); + setSelectValue(tagSelect, tagTom, ''); + setSelectValue(locationSelect, locationTom, ''); + setSelectValue(orgSelect, orgTom, ''); - applyFilter({ type: 'all', value: 'all' }); + applyFilter({ type: 'all', value: '' }); }); applyFilter(currentFilter);