Map filters: conditional visibility + initial display handling

This commit is contained in:
Jürgen Mummert
2026-02-26 20:31:45 +01:00
parent fb58c50f18
commit dedf8868b5
6 changed files with 265 additions and 98 deletions
+35 -1
View File
@@ -9,7 +9,7 @@ use Contao\StringUtil;
$GLOBALS['TL_DCA']['tl_module']['palettes']['member_organizations'] = '{title_legend},name,headline,type;{eventmanager_legend},editPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
$GLOBALS['TL_DCA']['tl_module']['palettes']['member_events'] = '{title_legend},name,headline,type;{eventmanager_legend},editPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
$GLOBALS['TL_DCA']['tl_module']['palettes']['event_filter'] = '{title_legend},name,headline,type;{eventmanager_legend},cal_calendar,eventListDomId;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
$GLOBALS['TL_DCA']['tl_module']['palettes']['eventmanager_map'] = '{title_legend},name,headline,type;{eventmanager_legend},mapShowOrganizations,organizationTypeTags,mapShowExternalOrganizations,mapShowEvents,mapEventColor,mapOrganizationColor,mapCenterMode;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
$GLOBALS['TL_DCA']['tl_module']['palettes']['eventmanager_map'] = '{title_legend},name,headline,type;{eventmanager_legend},mapShowOrganizations,organizationTypeTags,mapShowExternalOrganizations,mapShowEvents,mapInitialDisplay,mapEventColor,mapOrganizationColor,mapCenterMode;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
$GLOBALS['TL_DCA']['tl_module']['palettes']['organization_edit'] = '{title_legend},name,headline,type;{eventmanager_legend},listPage,logoFolder,organizationTypeTags;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
$GLOBALS['TL_DCA']['tl_module']['palettes']['event_edit'] = '{title_legend},name,headline,type;{eventmanager_legend},listPage,eventFolder,termsPage,frontendAuthorId,frontendArchiveId,eventTypeTags;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
@@ -161,7 +161,9 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['eventListDomId'] = [
];
$GLOBALS['TL_DCA']['tl_module']['palettes']['__selector__'][] = 'mapCenterMode';
$GLOBALS['TL_DCA']['tl_module']['palettes']['__selector__'][] = 'mapInitialDisplay';
$GLOBALS['TL_DCA']['tl_module']['subpalettes']['mapCenterMode_custom'] = 'mapCenterLat,mapCenterLng,mapCenterZoom';
$GLOBALS['TL_DCA']['tl_module']['subpalettes']['mapInitialDisplay_organization_tag'] = 'mapInitialOrganizationTagId';
$GLOBALS['TL_DCA']['tl_module']['fields']['mapShowOrganizations'] = [
'label' => &$GLOBALS['TL_LANG']['tl_module']['mapShowOrganizations'],
@@ -187,6 +189,38 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['mapShowEvents'] = [
'sql' => ['type' => 'string', 'length' => 1, 'fixed' => true, 'default' => ''],
];
$GLOBALS['TL_DCA']['tl_module']['fields']['mapInitialDisplay'] = [
'label' => &$GLOBALS['TL_LANG']['tl_module']['mapInitialDisplay'],
'exclude' => true,
'inputType' => 'select',
'options' => ['random', 'events', 'organization_tag'],
'reference' => &$GLOBALS['TL_LANG']['tl_module']['mapInitialDisplay_options'],
'eval' => ['mandatory' => true, 'submitOnChange' => true, 'tl_class' => 'w50', 'includeBlankOption' => false],
'sql' => ['type' => 'string', 'length' => 32, 'default' => 'random'],
];
$GLOBALS['TL_DCA']['tl_module']['fields']['mapInitialOrganizationTagId'] = [
'label' => &$GLOBALS['TL_LANG']['tl_module']['mapInitialOrganizationTagId'],
'exclude' => true,
'inputType' => 'select',
'options_callback' => static function (): array {
$rows = Database::getInstance()
->prepare('SELECT DISTINCT t.id, t.tag FROM tl_tags t LEFT JOIN tl_tags_rel r ON r.tag_id=t.id AND r.ptable=? AND r.field=? ORDER BY t.tag ASC')
->execute('tl_organization', 'tags')
->fetchAllAssoc();
$options = [];
foreach ($rows as $row) {
$options[(int) $row['id']] = (string) $row['tag'];
}
return $options;
},
'eval' => ['includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'w50'],
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0],
];
$GLOBALS['TL_DCA']['tl_module']['fields']['mapEventColor'] = [
'label' => &$GLOBALS['TL_LANG']['tl_module']['mapEventColor'],
'exclude' => true,
+7
View File
@@ -16,6 +16,13 @@ $GLOBALS['TL_LANG']['tl_module']['eventTypeTags'] = ['Anzuzeigende Veranstaltung
$GLOBALS['TL_LANG']['tl_module']['mapShowOrganizations'] = ['Organisationen anzeigen', 'Wenn aktiviert, werden Organisations-Marker auf der Karte dargestellt.'];
$GLOBALS['TL_LANG']['tl_module']['mapShowExternalOrganizations'] = ['Externe Organisationen anzeigen', 'Wenn aktiviert, werden externe Organisationen (isExternal=1) zusätzlich auf der Karte dargestellt. Standard: nein.'];
$GLOBALS['TL_LANG']['tl_module']['mapShowEvents'] = ['Veranstaltungen anzeigen', 'Wenn aktiviert, werden Event- (inkl. Orts-) Marker auf der Karte dargestellt.'];
$GLOBALS['TL_LANG']['tl_module']['mapInitialDisplay'] = ['Initiale Anzeige', 'Definiert, welche Marker beim Laden der Karte initial angezeigt werden.'];
$GLOBALS['TL_LANG']['tl_module']['mapInitialDisplay_options'] = [
'random' => 'Zufällig',
'events' => 'Veranstaltungen',
'organization_tag' => 'Organisation mit Tag',
];
$GLOBALS['TL_LANG']['tl_module']['mapInitialOrganizationTagId'] = ['Initialer Organisationstag', 'Wählen Sie den Tag, der initial angezeigt werden soll (nur bei „Organisation mit Tag“).'];
$GLOBALS['TL_LANG']['tl_module']['mapEventColor'] = ['Event-Farbe (Kreise/Linien)', 'Farbe für Event-Cluster, Event-Punkte und Spiderfy-Verbindungslinien (Hex, z. B. #BC5067).'];
$GLOBALS['TL_LANG']['tl_module']['mapOrganizationColor'] = ['Organisationsfarbe', 'Einheitliche Farbe für alle Organisations-Marker (Hex, z. B. #BC5067).'];
$GLOBALS['TL_LANG']['tl_module']['mapCenterMode'] = ['Karten-Zentrierung', 'Wählen Sie, ob die Karte anhand der Marker oder mit festen Koordinaten zentriert werden soll.'];
+7
View File
@@ -16,6 +16,13 @@ $GLOBALS['TL_LANG']['tl_module']['eventTypeTags'] = ['Displayed event types', 'O
$GLOBALS['TL_LANG']['tl_module']['mapShowOrganizations'] = ['Show organizations', 'If enabled, organization markers are rendered on the map.'];
$GLOBALS['TL_LANG']['tl_module']['mapShowExternalOrganizations'] = ['Show external organizations', 'If enabled, external organizations (isExternal=1) are additionally rendered on the map. Default: no.'];
$GLOBALS['TL_LANG']['tl_module']['mapShowEvents'] = ['Show events', 'If enabled, event markers (including related locations) are rendered on the map.'];
$GLOBALS['TL_LANG']['tl_module']['mapInitialDisplay'] = ['Initial display', 'Defines which markers are initially shown when the map is loaded.'];
$GLOBALS['TL_LANG']['tl_module']['mapInitialDisplay_options'] = [
'random' => 'Random',
'events' => 'Events',
'organization_tag' => 'Organization with tag',
];
$GLOBALS['TL_LANG']['tl_module']['mapInitialOrganizationTagId'] = ['Initial organization tag', 'Select the tag to be initially shown (only for "Organization with tag").'];
$GLOBALS['TL_LANG']['tl_module']['mapEventColor'] = ['Event color (circles/lines)', 'Color for event clusters, event points and spiderfy connector lines (hex, e.g. #BC5067).'];
$GLOBALS['TL_LANG']['tl_module']['mapOrganizationColor'] = ['Organization color', 'Unified color for all organization markers (hex, e.g. #BC5067).'];
$GLOBALS['TL_LANG']['tl_module']['mapCenterMode'] = ['Map centering', 'Choose whether the map should center by markers or fixed coordinates.'];
+29 -25
View File
@@ -1,4 +1,9 @@
{% set tags = mapOrganizationTags|default([]) %}
{% set showOrganizations = mapShowOrganizations|default(false) %}
{% set showEvents = mapShowEvents|default(false) %}
{% set showTagButtons = showOrganizations and tags is iterable and tags|length > 0 %}
{% set showEventButton = showOrganizations and showEvents %}
{% set showFilterButtons = showTagButtons or showEventButton %}
<section
id="{{ mapFilterWrapperId|e('html_attr') }}"
@@ -7,16 +12,18 @@
role="region"
aria-label="Kartenfilter"
>
<button
type="button"
class="eventmanager-map-filter__toggle is-expanded"
data-map-filter-toggle="1"
aria-expanded="true"
aria-controls="{{ mapFilterGroupId|e('html_attr') }}"
>
<span class="eventmanager-map-filter__toggle-label eventmanager-map-filter__toggle-label--expand">Filter einblenden</span>
<span class="eventmanager-map-filter__toggle-label eventmanager-map-filter__toggle-label--collapse">Filter ausblenden</span>
</button>
{% if showFilterButtons %}
<button
type="button"
class="eventmanager-map-filter__toggle is-expanded"
data-map-filter-toggle="1"
aria-expanded="true"
aria-controls="{{ mapFilterGroupId|e('html_attr') }}"
>
<span class="eventmanager-map-filter__toggle-label eventmanager-map-filter__toggle-label--expand">Filter einblenden</span>
<span class="eventmanager-map-filter__toggle-label eventmanager-map-filter__toggle-label--collapse">Filter ausblenden</span>
</button>
{% endif %}
<div
id="{{ mapFilterGroupId|e('html_attr') }}"
@@ -24,14 +31,7 @@
role="group"
aria-label="Organisationstypen"
>
<button
type="button"
class="eventmanager-map-filter__tag is-active"
data-map-filter-action="all"
aria-pressed="true"
>Alle</button>
{% if tags is iterable and tags|length > 0 %}
{% if showTagButtons %}
{% for tag in tags %}
<button
type="button"
@@ -41,12 +41,14 @@
>{{ tag.label|e }}</button>
{% endfor %}
{% endif %}
<button
type="button"
class="eventmanager-map-filter__tag"
data-map-event-toggle="1"
aria-pressed="false"
>Veranstaltungen</button>
{% if showEventButton %}
<button
type="button"
class="eventmanager-map-filter__tag"
data-map-event-toggle="1"
aria-pressed="false"
>Veranstaltungen</button>
{% endif %}
<button
type="button"
@@ -73,6 +75,8 @@
data-map-data-id="{{ mapDataElementId|e('html_attr') }}"
data-map-event-color="{{ mapEventColor|default('#BC5067')|e('html_attr') }}"
data-map-organization-color="{{ mapOrganizationColor|default('#BC5067')|e('html_attr') }}"
data-map-initial-display="{{ mapInitialDisplay|default('all')|e('html_attr') }}"
data-map-initial-tag-id="{{ mapInitialTagId|default(0)|e('html_attr') }}"
data-map-center-mode="{{ mapCenterMode|default('markers')|e('html_attr') }}"
data-map-center-lat="{{ mapCenterLat|default('')|e('html_attr') }}"
data-map-center-lng="{{ mapCenterLng|default('')|e('html_attr') }}"
@@ -103,4 +107,4 @@
</style>
<script type="application/json" id="{{ mapDataElementId|e('html_attr') }}">{{ mapItemsJson|raw }}</script>
<script type="module" src="/bundles/mummertmediaeventmanager/assets/map-module.js?v=20260226"></script>
<script type="module" src="/bundles/mummertmediaeventmanager/assets/map-module.js?v=20260226d"></script>