{% extends "base.html" %} {% import "_project_pulse_macros.html" as pp %} {% block title %}{% if d.plan %}{{ d.plan.title }}{% else %}План{% endif %} — Проектный пульт{% endblock %} {% block page_title %}Проектный пульт · план{% endblock %} {% block head %} {% endblock %} {% block content %} {% if d.plan and d.plan.project_slug %} ← {{ d.plan.project_name }} {% else %} ← ко всем проектам {% endif %} {% if d.error == 'not_found' %}
План «{{ file_name }}» не найден.
{% elif d.error %}
{{ d.error }}
{% elif d.plan %} {% set pl = d.plan %}

{{ pl.title }}

{% if csrf and not write_blocked and pl.status not in ('done', 'archived') %} {# ЛИЧНАЯ звезда ПЛАНА (pin/mute/clear) - своя сущность, отдельно от проектной. #} {# ПРОЕКТНАЯ звезда (закрепляет проект-владельца) - как в шапке проекта. #} {% if pl.project_slug and pl.project_status not in ('done', 'archived') %} {% endif %} {% endif %}
{{ pp.status_chip(pl.status, pl.status_ru) }} {% if pl.phase_total %}фазы {{ pl.phase_done }}/{{ pl.phase_total }}{% endif %} {% if pl.date %}{{ pl.date }}{% endif %} {% if pl.business %}{{ pl.business }}{% endif %}
Где лежит файл
файл {{ pl.rel_path }}
{% if csrf and not write_blocked %}
{% if pl.profit_badge %}{{ pp.profit_badge(pl.profit_badge, pl.profit_reason, pl.profit_is_manual) }}{% else %}Профит не оценён{% endif %}
{% endif %}
{# ===== Схема-дерево (X-Mind, вариант А): корень = план, ветки = фазы ===== #} {% if pl.phases %} {% set done_count = pl.phases | selectattr('status', 'equalto', 'done') | list | length %}
Карта плана
{% if done_count %} {% endif %}
{{ pl.title }}
{% for ph in pl.phases %}
{%- if ph.status == 'done' -%}✓ {%- elif ph.status == 'in-progress' -%}◐ {%- elif ph.status == 'paused' -%}‖ {%- elif ph.status == 'archived' -%}📦 {%- else -%}○{%- endif -%} {{ pp.phase_label(ph) }}
{% endfor %}
готово в работе впереди архив
{% endif %} {# ===== Резюме: Хотели / Сделали (N из M) / Осталось ===== #} {% if pl.phases or pl.summary %}
Где мы
🎯 Хотели
{% if pl.summary %}
{{ pl.summary }}
{% else %}
описание плана не задано
{% endif %}
✅ Сделали
{{ pl.phase_done }} из {{ pl.phase_total }}
    {% for ph in pl.phases if ph.status == 'done' %}
  • {{ pp.phase_label(ph) }}
  • {% endfor %}
⏳ Осталось
    {% for ph in pl.phases if ph.status not in ('done', 'archived') %}
  • {{ pp.phase_label(ph) }}
  • {% endfor %}
{% set open_count = pl.phases | selectattr('status', 'in', ['todo', 'in-progress', 'paused']) | list | length %} {% if not open_count %}
всё закрыто 🎉
{% endif %}
{% endif %} {# ===== Перепривязка к проекту ===== #} {% if targets %}
🔗 {% if pl.project_slug %}Перепривязать к другому проекту{% else %}Привязать к проекту{% endif %}
{% if pl.project_slug %}

Сейчас: {{ pl.project_name }}

{% else %}

План пока не привязан ни к одному проекту.

{% endif %} {% if write_blocked %}
{{ write_blocked }}
{% else %}

Покажу точную правку до записи. Изменение уйдёт в карточки проектов на диске.

{% endif %}
{% endif %} {# ===== Действия с планом: реализовано / архив ===== #} {% if csrf and not write_blocked and pl.status not in ('done','archived') %}

«Реализовано» — если фичу сделали, а план показывает «в работе». «Архив» — если план не планируешь делать, чтобы не засорял.

{% endif %} {% if pl.status == 'archived' %}
📦 Этот план в архиве — скрыт из списков по умолчанию.
{% endif %} {# ===== Фазы — статус + кнопки реализовать/архивировать каждую ===== #} {% if pl.phases %} {% set ph_actionable = csrf and not write_blocked %} {% set done_count = pl.phases | selectattr('status', 'equalto', 'done') | list | length %}
Фазы
{% if done_count %} {% endif %}
{% if ph_actionable %}

Нажми ✓ «Готово» или 📦 «В архив» — изменение на месте, без перехода. Отметь чекбоксы слева, чтобы применить пачкой.

{% endif %}
{% endif %} {# ===== Полный текст плана ===== #} {% if pl.body_html %}
План целиком
{{ pl.body_html|safe }}
{% endif %} {% else %}
Нет данных по плану.
{% endif %} {% endblock %} {% block scripts %} {% endblock %}