User Activity
User login + audit-trail activity for the reporting period.
{{ fs.panel_head("Active users over time", meta="daily unique users + total events") }}
{% if render_mode == 'fragment' and not fragment_scripts_enabled %}
{% endif %}
{# 2 + 3. Activity by type + Top users — two-up panels (single column main flattens to single panel each) #}
{% if activity_by_type and activity_by_type | length > 0 %}
{{ server_svgs.get('daily_logins', '') | safe }}
{% else %}
{% endif %}
{{ fs.panel_head("Activity breakdown by type", meta=((activity_by_type | length) | string) ~ " event types") }}
{% if render_mode == 'fragment' and not fragment_scripts_enabled %}
{% endif %}
{% if top_users and top_users | length > 0 %}
{{ server_svgs.get('activity_by_type', '') | safe }}
{% else %}
{% endif %}
{{ fs.panel_head("Most active users", meta="top 10 by total actions") }}
{% if render_mode == 'fragment' and not fragment_scripts_enabled %}
{# Top Users table — preserved from pre-migration template. #}
{{ server_svgs.get('top_users', '') | safe }}
{% else %}
{% endif %}
{{ fs.panel_head("Top active users", meta="ranked by total activity") }}
{% endif %}
{# Activity by type table — preserved from pre-migration template. #}
{% if activity_by_type and activity_by_type | length > 0 %}
| Rank | User | Total Actions | Days Active | Event Types | Last Active |
|---|---|---|---|---|---|
| {{ loop.index }} | {{ row['User'] }} | {{ actions }} | {{ row['Logins'] }} | {{ row['Event Types'] }} | {{ row['Last Active'] }} |
{{ fs.panel_head("Activity by event type", meta="counts + share of total") }}
{% endif %}
{# Recent Activity table — preserved from pre-migration template:177-208.
Cap at first 100 rows; CSV/XLSX export carries the full set. #}
| Event Type | Count | Percentage |
|---|---|---|
| {{ et }} | {{ row['Count'] }} | {{ "%.1f"|format(row['Percentage'] | float) }}% |
{{ fs.panel_head("Recent activity", meta="latest events, most recent first") }}
{% if data and data | length > 0 %}
{% if data | length > 100 %}
{% endif %}
| Time | User | Event Type | Project |
|---|---|---|---|
| {{ row['Time'] }} | {{ row['User'] }} | {{ et }} | {{ row['Project'] if row.get('Project') else '—' }} |
Showing first 100 of {{ data | length }} events. Export to CSV/XLSX for the full set.
{% endif %} {% else %}No activity found
No user activity matches the current criteria.