Read in:
Русский

Дашборд созвонов

Два макета для базы, куда попадают записанные, расшифрованные и разобранные созвоны: таймлайн долгих нитей и экран, где вы проверяете, что предложено по одному созвону. Оба читают обычные заметки и пишут обратно через updateNotes. Почему они устроены так, рассказано в эссе Созвоны превращаются в нити.

trip2g не записывает, не расшифровывает и не разбирает созвоны. Транскрипт, разбор и карту тем пишет что-то другое: диктофон, который сохраняет в базу, скрипт или агент с API-ключом. Оба макета эти заметки читают. Пишут они только заметку правок созвона, ключ hidden у нити и заметку человека, когда вы добавляете нового.

Демо работают на выдуманных данных. Посетитель может нажимать всё, но изменения остаются во вкладке; изменения владельца сайта записываются в заметки. У демо-заметок намеренно стоит search: false, чтобы выдуманные созвоны не попадали в поиск по сайту.

Установка

Скопируйте три файла из docs/_layouts/calls/ в _layouts/calls/ своей базы: threads.html, call.html и frontmatter.js. Потом заведите по заметке на страницу:

---
title: Нити
layout: calls/threads
---
---
title: Созвон
layout: calls/call
owner: Ольга Миронова
---

Текст заметки страницы показывается под заголовком.

Какие заметки читают страницы

Заметка Папка по умолчанию Что в ней
Транскрипт transcripts/ Строки Спикер | MM:SS, под каждой — что сказано. Во frontmatter можно title и duration_min
Разбор calls/ type: review, путь transcript:, карта speakers: от метки к имени, по желанию speakers_confidence: (unknown отмечает метку), assumed: true, если спикеры или темы угаданы, по желанию date: (без него — дата из пути транскрипта, потом из пути разбора). Первая строка текста — повестка
Карта тем topics/ То же имя файла, что у разбора. По желанию title — его страница показывает как название созвона вместо повестки. Абзац-сводка, потом раздел ## Topics со строками MM:SS | тема
Нить threads/ type: thread, group, kind, status, people, aliases, по желанию priority и hidden, по желанию дата last, по которой сортируется нить, чья хронология ещё не ссылается ни на один созвон. Список ## Chronology, по строке на созвон, и список ## Open items
Человек people/ По заметке на человека, заголовок — имя. confirmed: false отмечает догадку. Файл, чьё имя начинается с _, пропускается
Категория categories/ type: call-category, order, по желанию kind (client включает оценку продажи)
Правки call_edits/ Пишет страница одного созвона, по заметке на созвон

Id созвона — имя файла его разбора. Карта тем и заметка правок называются так же.

Строка хронологии начинается со ссылки на созвон, подписанной датой:

## Chronology

- [[calls/c8e1a5|2026-07-31]]: Налог до 25-го.
  Decided: амортизируем ростер. Open: отправить счёт.
- 2026-10-01: Бухгалтер прислал шаблон по почте.

Строка со ссылкой на разбор или транскрипт — точка на таймлайне, дата берётся из подписи ссылки. Строка без такой ссылки, например письмо или решение вне созвона, видна в цепочке нити, но точкой не становится. Decided: и Open: начинают новые строки в боковой панели. Заголовки и эти слова настраиваются, русское демо использует «Хронология», «Решили:» и «Открыто:».

Настройки страницы нитей

Ключ По умолчанию Значение
threads threads/* Glob заметок нитей
reviews, transcripts calls/*, transcripts/* Glob'ы, по которым ссылка на созвон отличается от остальных
thread_type thread type заметки нити
chronology_heading Chronology Заголовок списка хронологии
open_heading Open items Заголовок списка открытого
outcome_labels [Decided, Open] Слова, с которых в цепочке начинается новая строка
groups пусто Порядок групп; без него группы идут по своей верхней нити: сначала по приоритету, потом по активности
stale_days 21 Через сколько дней без созвона нить считается затихшей
span_months 3 Сколько месяцев видно при открытии
today текущая дата Фиксирует «сегодня», для демо
locale en Даты, названия месяцев и формы множественного числа
ui английский Строки интерфейса, см. ниже

Внутри группы нити идут по priority, потом по активности: свежие созвоны весят больше, и вес вдвое падает за каждые три недели без созвона. Скрыть нить ставит hidden: true во frontmatter нити; галочка Скрытые в панели показывает их снова.

Настройки страницы созвона

Ключ По умолчанию Значение
owner пусто Ваше имя, как оно записано в speakers; у этой метки написано «это вы»
reviews, topics, transcripts calls/*, topics/*, transcripts/* Glob'ы
people, threads, categories people/**, threads/*, categories/* Glob'ы
edits call_edits Папка заметок правок
people_folder people Где + новый человек создаёт заметку
review_type, thread_type, category_type review, thread, call-category Значения type, которые ищет страница
topics_heading Topics Заголовок раздела карты тем
topic_line {tc} | {text} Вид строки темы
transcript_line {who} | {tc} Вид строки спикера в транскрипте
pending_since пусто Дата; транскрипты с неё без разбора показываются как ждущие
transcripts_inline false Класть все транскрипты в страницу, а не загружать по одному
scores три оценки Список из key, label и необязательного only_kind
subgraph пусто Добавляется в заметки, которые создаёт страница, см. ru/user/subgraphs
locale, ui en, английский Как выше

Созвон ждёт вашей проверки, пока у него assumed: true и в заметке правок нет хотя бы одной из четырёх отметок verified: спикеры, категория, нити, темы. Всё проверено ставит все четыре и открывает следующий ждущий созвон.

Правки сохраняются сами через секунду после последнего изменения. Страница держит их в call_edits/<id>.md, а не в разборе: разбор принадлежит тому, кто его написал, а заметка правок — странице. Перед записью страница сверяет хэш заметки, так что правка, сделанная тем временем в другом месте, не затирается.

Транскрипты загружаются по одному запросом ReadNote — это запрос notePaths из раздела Прочитать markdown заметки. Со страницы его может вызвать только сессия админа сайта, поэтому публичное демо вместо этого ставит transcripts_inline: true.

Заметка правок

Страница созвона пишет call_edits/<id>.md, по заметке на созвон. Её frontmatter — договор для всего, что читает ваши проверки:

Ключ Что в нём
call Id созвона
review Путь заметки разбора
category Путь заметки категории
speakers Карта от метки спикера к пути заметки человека
threads Пути заметок нитей, к которым относится созвон
topics_wrong Таймкоды тем, отмеченных «не так»
topic_threads Карта от таймкода темы к пути нити
extra_topics Пропущенные темы, по строке на тему
scores Карта от ключа оценки к числу от 1 до 10
outcome Что решили и что осталось открытым, текстом
verified Что из speakers, category, threads и topics вы проверили
updated Время последнего сохранения

Текст заметки повторяет то же в читаемом виде. В демо есть одна такая: заметка правок к просмотру магазина. Обратно в разбор её ничто в trip2g не переносит. То, что пишет разборы, может прочитать её на следующем проходе: взять выбранного вами спикера, выбросить тему, отмеченную «не так», дописать строку хронологии в выбранную нить. Этого читателя вы пишете сами.

Язык интерфейса

У каждой строки есть английское значение по умолчанию. Чтобы перевести, перечислите ключи под ui в заметке страницы; русские демо-страницы содержат полный список. Для счётчиков задаются формы множественного числа:

locale: ru
ui:
  search: "Найти нить"
  calls:
    one: "{n} встреча"
    few: "{n} встречи"
    many: "{n} встреч"
    other: "{n} встречи"

Формы выбираются по Intl.PluralRules для locale.

Ограничения

  • Страница кладёт в HTML все разборы, нити и карты тем, которые нашли её glob'ы. Несколько сотен созвонов — нормально, тысячи — медленно.
  • Макеты читают frontmatter в браузере небольшим парсером (frontmatter.js): карты, списки и блоки | / >, без якорей и тегов.
  • Созвон не привязывается к нити сам. Страница созвона показывает нити, чьи заметки ссылаются на этот созвон, и сохраняет выбранные вами нити в заметку правок; строку в хронологию добавляет то, что ведёт заметки нитей.
  • Сохранение — это два запроса: сначала хэш заметки правок, потом запись. Если закрыть вкладку в течение секунды после правки, браузер спросит, точно ли уйти; если уйти всё равно, последняя правка может пропасть.