-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
-
keyboard_arrow_right keyboard_arrow_down
-
-
keyboard_arrow_right keyboard_arrow_down
- YCLIENTS
- Маркетплейс интеграций
- Расширения внутри YCLIENTS
- Техническая документация по интеграции расширений внутри YCLIENTS
- Лист ожидания/Задачник
Лист ожидания/Задачник
Входные гет-параметры для iframe
Обязательные гет-параметры:
- salon_id: int — id текущего салона, куда встраивается виджет.
- hash: string — строка, полученная посредством конкатенации salon_id и токена партнера, хешированная алгоритмом SHA1.
- user_id: int — id текущего пользователя erp.
- date: string — выбранная дана в журнале записи в формате YYYY-MM-DD.
- is_week_mode: boolean — статус активного недельного режима в журнале записи.
Изменение статуса наличия недельного режима в журнале записи
Пример пэйлоада:
{action: “timetable_is_week_mode”, {value: true}}.
Пояснение к параметрам:
value: boolean — флаг наличия недельного режима.
Общение с YCLIENTS через postMessage
Изменение выбранного дня в журнале записи.
Пример пэйлоада:
{action: “timetable_date_change”, date: “2023-01-31”}.
Пояснение к параметрам:
date: string — выбранная дата в формате YYYY-MM-DD.
Технические ограничения
- В коде виджета должен быть предусмотрен fallback на использование localStorage/sesionStorage/cookie, так как виджет встраивается через iframe, и если пользователь сидит в режиме инкогнито, то при попытке обратиться к вышеописанным сервисам может происходить ошибка Access is denied for this document (ссылка на проблему). Самым простым решением будет отказаться от этих сервисов. Если это невозможно, то следует либо предусмотреть fallback для них, либо же показывать соответствующий экран о невозможности работы виджета.
- В случае, если авторизация в виджете требует проставление и дальнейшее считывание cookie, то у куки авторизации обязательно должен быть проставлен атрибут SameSite со значением ‘none’. Без этого параметра виджет не сможет достать ее, в связи с кроссдоменным взаимодействием.
Важно: помимо этого виджет будет недоступен для браузера сафари, в связи с нестабильным механизмом считывания кук при кроссдоменном взаимодействии.
Требования по производительности
-
Отсутствие спама запросов в рантайме, необходимо минимизировать их количество.
-
Суммарный размер production-ready js/css файлов менее 700kb.
-
Размер отдельно взятого production-ready js/css файла менее 300kb.
-
Потребление памяти (вкладка Memory, chrome dev-tools), составляет менее 50% от памяти, потребляемой YCLIENTS.
-
Отсутствие регулярных сложных вычислений, реакций на различные события (работа с API, web-сокетами). Работа виджета не должна блокировать пользовательское взаимодействие с интерфейсом YCLIENTS. Диагностировать длительные «провисания» можно на вкладке «Performance» в chrome dev-tools (они будут помечены красным флагом).
Более подробно с инструментом можно ознакомиться в статье от гугла.
Особенности жизненного цикла виджета
Виджет не инициализируется при инициализации журнала записи, а ждет открытия через пользовательское взаимодействие (реализовано на стороне YCLIENTS). Причем после инициализации виджета, в целях производительности, происходит его уничтожение, в случае, если пользователь закрыл виджет дольше, чем на 5 минут.
Таким образом в рамках одной пользовательской сессии может происходить несколько инициализаций виджета (как в журнале записи, так и в окне записи), он должен быть готов к этому, т. е. занимать минимально возможное время инициализации, отправлять минимально возможное количество запросов, загружать как можно меньше исходного кода.
API-методы
Подключение или отключение вашего расширения
В первую очередь потребуется разработать приложение для Маркетплейса YCLIENTS.
Как это сделать — описано в основной документации.
Для того чтобы подключить/отключить расширение какому-либо салону, необходимо использовать метод ниже. Приложение должно быть уже активировано в салоне на момент вызова метода.
POST /marketplace/application/install_frame
Параметры:
- salon_id - int — ID филиала, в который устанавливается ваше расширение.
- application_id - int — ID приложения, от имени которого устанавливается расширение.
- type - string - waiting_list — для Листа Ожидания или task_tracker — для Задачника.
- url - string|null — ссылка на iframe для встраивания. Если необходимо отключить расширение в филиале — передавать null.
Важно: в одном салоне может быть в один момент только один iframe каждого типа waiting_list, task_tracker. Если в салоне уже имеется таковой — в ответе будет возвращена ошибка 400.
Установка маркера невыполненного действия
При наступлении какого-либо события, требующего внимания пользователя YCLIENTS, вы можете подсветить вкладку вашего расширения специальной меткой. Так, например, если появилась новая запись в Листе Ожидания — есть возможность установить метку через API-метод, описанный ниже. Справедливо и обратное действие — если, например, запись была просмотрена — вы можете убрать метку на вкладке.
POST /marketplace/application/toggle_highlight
Параметры:
- salon_id - int — ID филиала, в который устанавливается расширение.
- application_id - int — ID приложения, от имени которого устанавливается расширение.
- user_id - int|null — ID пользователя YCLIENTS, которому устанавливается метка. Если передан null — метка установится не пользователю, а всему салону
(Важно: снимать такую метку нужно тоже через передачу user_id: null). - type - string — waiting_list или task_tracker.
- is_enabled - bool — включена ли метка расширения, true — устанавливает метку, false - снимает ее.
{ action: 'load_client', payload: '+12345678' // либо номер либо строка, по которой клиента можно будет найти в другом табе }