{% extends "base.html" %} {% import "report_sections.html" as rs with context %} {% block title %}{{ dashboard.title if dashboard else 'No such dashboard' }}{% endblock %} {% block content %} {% if missing %}

No dashboard called “{{ missing }}”

There is no dashboards/{{ missing }}.toml in the data folder.{% if others %} These dashboards are:{% endif %}

{% if others %}{% endif %}

Make it yours: describe a dashboard and your own AI agent builds it.

{% else %}

{{ dashboard.title }}

{% if dashboard.description %}

{{ dashboard.description }}

{% endif %}

Adjust

{% if change %}
Last changed {{ change_when }}: “{{ change.subject }}” {%- if change.can_undo %} ·
{% endif %} · All changes
{% endif %} {% if problems %}
{{ problems | length }} problem{{ '' if problems | length == 1 else 's' }} in {{ dashboard.file }}. Paste these lines to your agent, or run hermitcrm check.{% if widgets %} The widgets without a problem are below.{% endif %}
{% endif %}
{% for w in widgets %}

{{ w.title }}

{% if w.type == 'count' %}

{{ w.count }}

{% elif w.type == 'list' %}
{% for c in w.columns %}{% endfor %} {% for r in w.rows %} {% for v in r.cells %}{% endfor %} {% else %} {% endfor %}
{{ c.label }}
{% if loop.first %}{{ v or '(empty)' }}{% else %}{{ v }}{% endif %}
none

{% if w.total > w.rows | length %}{{ w.rows | length }} of {{ w.total }} · {% endif %}open in {{ w.scope | capitalize }}

{% elif w.type == 'group' %} {% for b in w.bars %} {% else %} {% endfor %}
{% if b.url %}{{ b.label }}{% else %}{{ b.label }}{% endif %}{% if b.url and b.count %}{{ b.count }}{% else %}{{ b.count }}{% endif %}{{ rs.bar(b.count, w.max) }}
none

{{ w.total }} in all{% if w.more %} · {{ w.more }} more value{{ '' if w.more == 1 else 's' }} not shown{% endif %}

{% elif w.type == 'trend' %} {% for b in w.bars %} {% endfor %}
{% if w.every == 'week' %}week of {% endif %}{{ b.label or fmt_date(b.start) }}{% if b.count %}{{ b.count }}{% else %}0{% endif %}{{ rs.bar(b.count, w.max) }}

{{ w.total }} in all by {{ w.label }} date, {{ fmt_date(w.start) }} to {{ fmt_date(w.end) }}. A number opens the rows from that {{ w.every }} on.{% if w.clamped %} The newest {{ w.bars | length }} {{ w.every }}s are shown; {{ w.clamped }} older {{ 'one is' if w.clamped == 1 else 'ones are' }} left out.{% endif %}

{% elif w.type == 'report' %} {% set p = w.report.period %}

{{ fmt_date(p.start) }} to {{ fmt_date(p.end) }} ({{ p.days }}d). Click a number for its rows.

{{ rs['section_' ~ w.section](w.report, w.rows_query) }} {% endif %}
{% endfor %}
{% if not widgets and not problems %}

No widgets yet.

{% endif %} {% endif %} {% endblock %}