Admin: POI-Statistik erweitert (Nutzer-POIs nach Typ + Labels), SW by-v1099
- /admin/stats liefert jetzt zusätzlich user_poi_total + user_poi_by_type (User-POIs aus user_map_pois aufgeschlüsselt, komma-separierte Typen werden einzeln gezählt) - Admin System-Tab zeigt zwei Karten: · OSM-Cache nach Typ (was Overpass-Cache enthält) · Nutzer-POIs nach Typ (selbst erstellte Marker) - Interne Typ-Namen werden in lokalisierte Labels gemappt (tierarzt → Tierarzt, hundesalon → Hundesalon, etc.) - Header der Karten zeigt Gesamtzahl inline
This commit is contained in:
parent
cc4f030fd0
commit
15d319fbd5
6 changed files with 57 additions and 19 deletions
|
|
@ -652,17 +652,43 @@ window.Page_admin = (() => {
|
|||
</div>` : ''}
|
||||
</div>
|
||||
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
<p style="font-size:var(--text-sm);font-weight:600;margin:0 0 var(--space-3)">OSM-Cache nach Typ</p>
|
||||
<div style="display:flex;flex-direction:column;gap:var(--space-2)">
|
||||
${Object.entries(s.osm_by_type).map(([type, count]) => `
|
||||
${(() => {
|
||||
const POI_LABELS = {
|
||||
waste_basket: 'Mülleimer', dog_park: 'Hundewiese', drinking_water: 'Wasserstelle',
|
||||
tierarzt: 'Tierarzt', hundesalon: 'Hundesalon', hundeschule: 'Hundeschule',
|
||||
shop: 'Shop', restaurant: 'Café / Restaurant', bank: 'Sitzbank',
|
||||
hotel: 'Hotel', freilauf: 'Freilauf', kotbeutel: 'Kotbeutel',
|
||||
parkplatz: 'Parkplatz', treffpunkt: 'Treffpunkt', sonstiges: 'Sonstiges',
|
||||
giftkoeder: 'Giftköder', gefahr: 'Gefahr',
|
||||
};
|
||||
const label = t => POI_LABELS[t] || t;
|
||||
const row = ([type, count]) => `
|
||||
<div style="display:flex;justify-content:space-between;font-size:var(--text-sm)">
|
||||
<span style="color:var(--c-text-secondary)">${type}</span>
|
||||
<span style="color:var(--c-text-secondary)">${label(type)}</span>
|
||||
<span style="font-weight:600">${count.toLocaleString('de')}</span>
|
||||
</div>
|
||||
`).join('')}
|
||||
</div>`;
|
||||
const userByType = s.user_poi_by_type || {};
|
||||
const userTotal = s.user_poi_total ?? 0;
|
||||
return `
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
<p style="font-size:var(--text-sm);font-weight:600;margin:0 0 var(--space-3)">
|
||||
OSM-Cache nach Typ <span style="color:var(--c-text-muted);font-weight:400">— ${(s.osm_total || 0).toLocaleString('de')} gecacht</span>
|
||||
</p>
|
||||
<div style="display:flex;flex-direction:column;gap:var(--space-2)">
|
||||
${Object.entries(s.osm_by_type).map(row).join('')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
<p style="font-size:var(--text-sm);font-weight:600;margin:0 0 var(--space-3)">
|
||||
Nutzer-POIs nach Typ <span style="color:var(--c-text-muted);font-weight:400">— ${userTotal.toLocaleString('de')} gesamt</span>
|
||||
</p>
|
||||
<div style="display:flex;flex-direction:column;gap:var(--space-2)">
|
||||
${Object.keys(userByType).length
|
||||
? Object.entries(userByType).map(row).join('')
|
||||
: '<div style="color:var(--c-text-muted);font-size:var(--text-sm);text-align:center;padding:var(--space-2)">Noch keine Nutzer-POIs</div>'}
|
||||
</div>
|
||||
</div>`;
|
||||
})()}
|
||||
|
||||
<!-- Social Media Tracking -->
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue