STREAK: Как отслеживать число раз выполнения привычки подряд?
Карина АртамоноваПосле выпуска шаблона Гибкого трекера привычек в Notion мне поступил очень интересный запрос: как отслеживать число раз выполнения привычки подряд?
💥Действительно, streak, то есть серия повторений без перерыва может очень мотивировать и вдохновлять, вызывать гордость и стимулировать закрепление привычки.
Сhallenge accepted.

За основу я беру логику из шаблона Гибкого трекера привычек:
- есть база с задачами на привычки:
🔹задачам на привычки ставится дата выполнения,
🔹привычка отмечается чекбоксом с галочкой при выполнении, а при невыполнении чекбокс остается пустым
🔹 каждая такая задача на привычку привязана через рилейшен к виджету конкретно этой привычки

- база виджетов привычек нужна для получения статистики по задачам на привычку:
🔹в виджет привычки рилейшеном привязаны все задачи на эту привычку и через роллапы получаем данные о статистике выполнения привычки

Создаем 2 базы данных:
1) Привычки БД
В ней создадим 7 карточек "Бег", добавим проперти с датой выполнения и чекбокс Выполнено?
2) Виджеты БД
Тут создаем одну карточку "Виджет привычки Бег". Через двусторонний рилейшен привязываем все 7 карточек "Бега" из базы Привычки БД к созданному виджету.
Итак, мне нужно создать счетчик выполненных привычек, который обнуляется каждый раз, когда карточка "Бег" не выполнена.
Сразу понимаю, что в моей базе привычек крайними всегда будут невыполненные задачи на "Бег", так как я создаю привычки не каждый день, а сразу на месяц/неделю (как планируются привычки в моем трекере я подробно рассказываю в видео).
То есть нужно, чтобы счетчик не учитывал невыполненные привычки, у которых дата выполнения стоит на будущее или на сегодня. Следовательно, я не могу использовать чекбокс, нужно дополнительное проперти.
И в моем шаблоне как раз есть подходящее: визуальный индикатор в виде эмодзи цветного квадратика.

🔹если чекбокс отмечен галочкой - показывай зеленый квадратик 🟩
🔹если чекбокс пустой И дата в будущем - показывай серый квадратик ⬜
🔹если чекбокс пустой И дата в прошлом ИЛИ сегодня - показывай красный квадратик 🟥
if(prop("Выполнено?") == true, "🟩", if(prop("Дата") > now(), "⬜", "🟥"))
Чуть усложняю эту формулу: если дата выполнения привычки сегодня - показывай серый квадратик, а не красный. Для этого проверяю дату в задаче на соответствие сегодняшней дате с помощью функции now():

if(prop("Выполнено?") == true, "🟩", if(prop("Дата") > now() or formatDate(prop("Дата"), "MMM DD, YYYY") == formatDate(now(), "MMM DD, YYYY") or empty(prop("Дата")) == true, "⬜", "🟥"))
Мы будем обнулять счетчик выполненных привычек при появлении привычки с красным квадратиком, а не с пустым чекбоксом.
Ура, планирование привычек на будущее теперь никак не помешает мне считать серии выполненных привычек подряд!
Уточню, что речь именно о выполненных подряд, а не о выполненных каждый день подряд.
Если вы бегаете 3 раза в неделю: понедельник, среду и пятницу и побегали в первый раз в понедельник, то во вторник ваш счетчик не обнулится. Побегали в среду - получили 2 раза подряд на счетчике. Пропустили пятницу и... В субботу счетчик обнулился!
💪Делаю следующий шаг.
Все мои квадратики с точки зрения типа данных для формулы неразличимы - текст как текст. Чтобы иметь рычаг различия красных, зеленых и серых квадратиков создаю еще одно проперти "Символ" у задачи на привычку:

🔹если квадратик зеленый - показывай "1"
🔹если квадратик красный - показывай ":" (двоеточие - это special character, специальный символ, есть тут одна формула, которая умеет обрезать весь текст до определенного специального символа 😉)
🔹если квадратик серый - ничего не показывай, будь пустой.
В моем счетчике серии меня не интересуют серые квадратики. Только зеленые (суммируем) и красные (обнуляем).
if(prop("Цветной ярлык") == "🟩", "1", if(prop("Цветной ярлык") == "🟥", ":", ""))
С задачей на привычку мы закончили. Все дальнейшие манипуляции будут происходить с проперти у виджета привычки.
Создаем у виджета привычки роллап с получением от всех наших задач единичек и двоеточий "Роллап символов":

Нам нужно от Notion посчитать количество единиц после последнего двоеточия. Если двоеточие стоит последним, то единиц после двоеточия ноль, так и произойдет обнуление счетчика.
Создаю проперти с такой формулой, которая будет обрезать все символы из роллапа до последнего двоеточия, включая и само двоеточие. Называю проперти "Роллап подряд".

Этой формулой я говорю Notion:
Замени все символы до двоеточия на пустоту = удали все символы до двоеточия. Само двоеточие тоже удалится.
replaceAll(prop("Роллап символов"), ".*[:]", "")
Получается, в этом проперти всегда будут отображаться либо единички, либо пустота.
🔹Если последний символ - это двоеточие (= красный квадратик), Notion обрежет все, включая само последнее двоеточие - останется пустота.


🔹Если последний символ не двоеточие - то останутся все единички после последнего двоеточия. По одной единичке на зеленый квадратик. Число единичек в этом проперти и будет нашим искомым числом.


Теперь просто посчитаем количество символов в этом проперти: будет ноль - если проперти пустое или число количества единиц. Логично!)
😅Небольшая заминка: нам мешают запятые, через которые перечисляются значения из роллапа. Если мы будем считать символы, то запятые тоже будут учитываться, и это все сломает.
Создаю еще одно специальное проперти, которое поменяет запятые на пустоту, то есть удалит их: "Без запятых".

Сначала привожу роллап к текстовому формату функцией format() и применяю replaceAll(). Первый аргумент: где нужно поменять (отформатированное до текста проперти "Роллап подряд"), второй аргумент: что нужно поменять (запятые), а третий: на что нужно поменять (на пустоту).
replaceAll(format(prop("Роллап подряд")), ",", "")
Создаю финальное специальное проперти "Раз подряд": спокойно считаю количество символов после удаления запятых с помощью функции length(). Она и возвращает количество символов в указанном проперти.

length(prop("Без запятых"))
ИТОГО:
Получаем символ-статус задачи через роллап ➡️ обрезаем все до последнего двоеточия, включая двоеточие ➡️ убираем запятые ➡️ считаем количество единиц.
🔥 Готово!

Добавляю проперти-ярлык "Ярлык: серия" для вывода информации на карточку виджета:

"Делаю " + format(prop("Раз подряд")) + " раз подряд"
Итоговое отображение в Гибком трекере привычек:


🔗 СКАЧАТЬ ВЕРСИЮ ШАБЛОНА ГИБКОГО ТРЕКЕРА ПРИВЫЧЕК С ФУНКЦИЕЙ STREAK (СЕРИЯ ПОДРЯД): https://karina-art.notion.site/STREAKS-b02837ab72c642a6af37a77dffd7ee5c?pvs=4
☕ Угостить автора кофе: https://www.tinkoff.ru/rm/artamonova.karina3/RcOE898767/