{% extends "base.html" %} {% block title %}{{ dev.name }} — Puntavia{% endblock %} {% block head %} {% endblock %} {% block crumb %}{% with tab = 'overview' %}{% include "_device_head.html" %}{% endwith %}{% endblock %} {% block content %}
{# Сегодня — самое частое, ради чего открывают машину. #}
{{ tr('Сегодня') }} {{ o.day.day_human }} ⤢
{{ o.day.total_human }}
{{ o.tz_label }}, {{ tr('{t} у них').format(t=o.local_time) }} · {{ tr('{n} блоков активности').format(n=o.day.blocks|length) }}
{# Чем занят прямо сейчас — словами. Собирается из замеров, а не из разбора: блок закрывается с опозданием, и «сейчас» из него врёт. #}
{%- if o.now.state == 'paused' %} {{ tr('Пауза — сбор остановлен.') }} {%- elif o.now.state == 'off' %} {{ tr('Машина не на связи.') }} {%- elif o.now.state == 'idle' %} {{ tr('За компьютером сейчас никого.') }} {%- else %} {%- if o.now.state == 'waiting' %}{{ tr('Ждут машину:') }} {%- else %}{{ tr('Сейчас:') }}{% endif %} {{ o.now.process }} {%- if o.now.title %} — {{ o.now.title }}{% endif %}, {{ tr('уже {t}').format(t=o.now.human) }} {{ tr('(с {t})').format(t=o.now.since) }} {%- if o.now.prev %} {{ tr('до этого') }} {{ o.now.prev.process }}, {{ o.now.prev.human }} {%- endif %} {%- endif %}
{% if o.day.spans %}
{% for h in range(0, 25, 2) %} {{ '%02d'|format(h if h < 24 else 0) }} {% endfor %}
{% for s in o.day.segments %} {% endfor %}
{{ tr('итого') }} {{ tr('работа') }} {{ o.day.work_human }} {{ tr('перерывы') }} {{ o.day.break_human }} {{ tr('плотность') }} {{ o.day.focus }}% {{ tr('весь день →') }}
{% else %}
{{ tr('Сегодня данных ещё нет') }} {% if o.paused %}{{ tr('Сбор на паузе.') }} {% elif not o.alive %}{{ tr('Агент давно не выходил на связь.') }} {% else %}{{ tr('Появятся, как только человек начнёт работать.') }}{% endif %}
{% endif %}
{# Одна карточка на три масштаба вместо трёх карточек подряд: переключатель меняет только текст, ⤢ ведёт в тот же масштаб целиком. Вкладки без JS — :checked у скрытых радиокнопок, поэтому работает и с выключенным. #}
{{ tr('Сводка') }} {% for sc in o.scales %} {% endfor %}
{% for sc in o.scales %}
{% if sc.text %}

{{ sc.text }}

{% else %}
{{ tr('Сводка появится, когда разбор дойдёт до этих дней.') }}
{% endif %}
{% endfor %}
{% include "_calendar.html" %} {% if o.last_blocks %}
{{ tr('Чем занимались') }} {{ tr('последние блоки') }} ⤢
{% for b in o.last_blocks %}
{{ b.start }} — {{ b.end }} · {{ b.human }} {% if b.category %}{{ tr(b.category_label) }}{% endif %}
{{ b.title }}
{{ b.summary }}
{% endfor %}
{% endif %}
{{ o.period.total_human }}
{{ tr('за {n} дней').format(n=o.days_back) }}
{{ o.period.avg_human }}
{{ tr('в среднем в день') }}
{{ o.period.break_human }}
{{ tr('перерывы') }}
{{ o.period.focus }}%
{{ tr('плотность') }}
{{ tr('По дням') }} {{ tr('{n} дней').format(n=o.days_back) }} ⤢
{% for row in o.period.rows_packed %} {% if row.gap %}
{{ tr('{n} дн. без активности').format(n=row.n) }} {{ row.d1 }}{% if row.n > 1 %} – {{ row.d2 }}{% endif %}
{% else %} {{ row.short }} {{ row.weekday }} {{ row.human }} {{ row.break_human if row.total else '' }} {% endif %} {% endfor %}
{% if o.apps %}
{{ tr('На чём уходит время') }} {{ tr('{n} дней').format(n=o.days_back) }} ⤢
{% for a in o.apps %}
{{ a.label }} {{ a.human }}
{% endfor %}
{% endif %}
{{ tr('Машина') }} {% if can('manage_data') %} ⤢ {% endif %}
  • {{ tr('агент') }}
    {% if o.paused %}{% set pp = pause_parts(dev) %} {{ tr(pp[1]).format(**pp[2]) }} {% elif o.alive %}{{ tr('сбор идёт') }} {% else %}{{ tr('агент молчит') }}{% endif %} {% if can('manage_data') %} {% endif %}
  • {{ tr('система') }}
    {{ dev.platform or '—' }} · {{ dev.backend or '—' }}
  • {{ tr('часовой пояс') }}
    {{ o.tz_label }} · {{ o.local_time }}
  • {{ tr('сотрудник') }}
    {{ person.name if person else tr('— не закреплена —') }}
  • {{ tr('версия агента') }}
    {{ dev.version or '—' }}
{% if can('manage_data') %}

{{ tr('Настроить машины') }}

{% endif %}
{% endblock %} {% block head_extra %}{% endblock %}