-
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
-
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
- Маркетплейс интеграций
- Плагинизация
- Руководство по созданию Frontend плагина
- Плагинизация ERP
- Примеры плагинов ERP
- Плагин отображения имени клиента (timetable-record-client-name)
Плагин отображения имени клиента (timetable-record-client-name)
Репозиторий
https://github.com/yclients/example-plugin-frontend/tree/main/apps/timetable-record-client-name
Что делает
Плагин отображает полное имя клиента (фамилия, имя, отчество) в расписании записей. Плагин получает персональные данные клиента от хоста и форматирует их в читаемый вид для отображения в пользовательском интерфейсе.
Пример работы: Клеперов Евгений Викторович вместо сокращенного «Евгений К.».
*Рис. 1. Полное ФИО клиента в таблице записи
Принцип работы
Старт работы плагина
Запуск плагина происходит через функцию initializePlugin
(репозиторий)
export function initializePlugin() {
// Обработчик события готовности хоста
const handleHostReadyEvent = (event: CustomEvent<THostReadyEvent>): void => {
console.log('[Plugin] Получено событие готовности хоста:', event);
const { containerId, payload } = event.detail;
const container = document.querySelector(
`[data-plugin-container="${containerId}"]`,
);
// Формируем полное имя клиента с помощью сервиса
const fullName = ClientNameService.formatFullName(payload);
container.replaceChildren(fullName);
// Отправляем событие о готовности плагина
pluginEventEmitter.emit(PLUGIN_EVENT_NAMES.READY);
};
// Подписываемся на событие готовности хоста
hostEventEmitter.onDocument(HOST_EVENT_NAMES.READY, handleHostReadyEvent);
}
При старте плагин подписывается на событие HOST_EVENT_NAMES.READY, которое будет отправлено хостом, когда он будет готов для работы с плагинами.
handleHostReadyEvent
Обработчик события готовности хоста выполняет следующие действия:
- Получает данные о клиенте (имя, фамилия, отчество) из payload события.
- Находит контейнер для отображения по containerId.
- Форматирует полное имя клиента с помощью ClientNameService.
- Заменяет содержимое контейнера на отформатированное имя.
- Отправляет событие о готовности плагина.
ClientNameService
export class ClientNameService {
/**
* Создает читаемое представление клиента для отображения в пользовательском интерфейсе.
*
* @param personalData - Персональные данные клиента.
* @returns Готовое к отображению полное имя клиента.
*/
static formatFullName({
clientSurname,
clientName,
clientPatronymic,
}: THostReadyPayload): string {
return [clientSurname, clientName, clientPatronymic]
.map((part) => part?.trim())
.filter(Boolean)
.join(' ');
}
}
Сервис принимает персональные данные клиента и возвращает отформатированную строку с полным именем. Метод:
- Удаляет лишние пробелы из каждой части имени.
- Фильтрует пустые значения.
- Объединяет части имени через пробел.
Примеры:
["Иванов", "Иван", "Иванович"]→"Иванов Иван Иванович"["Петров", "", "Сергеевич"]→"Петров Сергеевич"[" Сидоров ", "Алексей", null]→"Сидоров Алексей"
Типы событий
Плагин использует систему событий для коммуникации с хостом:
- THostReadyEvent — событие готовности хоста, содержит данные клиента.
- TPluginReadyEvent — событие готовности плагина, отправляется после инициализации.
Структура данных клиента:
export type THostReadyPayload = {
clientName: string; // Имя клиента
clientSurname: string; // Фамилия клиента
clientPatronymic: string; // Отчество клиента
};
Зависимости
Плагин использует следующие основные зависимости:
@yclients-plugins/utils— утилиты для работы с событиями.@yclients-configs/vite— конфигурация сборки.
Сборка и разработка
># Установка зависимостей npm install # Запуск в режиме разработки npm run dev # Сборка для продакшена npm run build # Проверка типов npm run typecheck # Линтинг npm run lint
Требования
- Node.js 18+.
- npm 8+.