Web Extension для Safari (macOS) и Google Chrome, которое помогает разработчикам Битрикс24 видеть ID полей сущностей при наведении курсора. Расширение работает на всех страницах с Битрикс24 и автоматически обнаруживает поля редактора сущностей.
bitrix24-help-developer/
├── bitrix24-help-developer/ # Основное macOS приложение-обертка
│ ├── AppDelegate.swift # Точка входа приложения, управление жизненным циклом
│ ├── ViewController.swift # Контроллер главного окна, взаимодействие с Safari Extension API
│ ├── Assets.xcassets/ # Ресурсы приложения (иконки, цвета)
│ ├── Base.lproj/ # Локализованные ресурсы
│ └── Resources/ # HTML/CSS/JS ресурсы для окна приложения
│ ├── Main.html # HTML интерфейса окна приложения
│ ├── Script.js # JavaScript логика окна приложения
│ ├── Style.css # Стили окна приложения
│ └── Icon.png # Иконка приложения
│
├── bitrix24-help-developer Extension/ # Safari Web Extension
│ ├── SafariWebExtensionHandler.swift # Обработчик нативных сообщений от расширения
│ ├── Info.plist # Конфигурация расширения для macOS
│ └── Resources/ # Ресурсы расширения
│ ├── manifest.json # Манифест расширения (WebExtensions API)
│ ├── background.js # Background script для обработки событий расширения
│ ├── content.js # Content script - основная логика показа ID полей
│ ├── tooltip.css # Стили тултипа с ID полей
│ ├── popup.html # HTML интерфейса popup расширения
│ ├── popup.js # JavaScript логика popup
│ ├── popup.css # Стили popup
│ ├── images/ # Иконки расширения различных размеров
│ └── _locales/ # Локализация
│ └── en/
│ └── messages.json # Тексты интерфейса на английском
│
├── bitrix24-help-developer Chrome Extension/ # Chrome Web Extension
│ └── Resources/ # Ресурсы расширения
│ ├── manifest.json # Манифест расширения (Chrome MV3)
│ ├── background.js # Service worker для обработки событий расширения
│ ├── content.js # Content script - основная логика показа ID полей
│ ├── tooltip.css # Стили тултипа с ID полей
│ ├── popup.html # HTML интерфейса popup расширения
│ ├── popup.js # JavaScript логика popup
│ ├── popup.css # Стили popup
│ ├── images/ # Иконки расширения различных размеров
│ └── _locales/ # Локализация
│ └── en/
│ └── messages.json # Тексты интерфейса на английском
│
└── bitrix24-help-developer.xcodeproj/ # Xcode проект
└── project.pbxproj # Конфигурация проекта Xcode
- Назначение: Главный делегат приложения macOS
- Функции:
applicationDidFinishLaunching: Инициализация при запускеapplicationShouldTerminateAfterLastWindowClosed: Автоматическое завершение при закрытии окна
- Назначение: Управление главным окном приложения и взаимодействие с Safari Extension API
- Функции:
viewDidLoad: Инициализация WebView и загрузка интерфейсаwebView(_:didFinish:): Проверка состояния расширения после загрузки страницыuserContentController(_:didReceive:): Обработка сообщений от JavaScript для открытия настроек Safari
- Назначение: HTML интерфейс окна приложения
- Содержимое: Отображение статуса расширения и кнопка для открытия настроек Safari
- Назначение: JavaScript логика окна приложения
- Функции: Обновление UI в зависимости от состояния расширения
- Назначение: Обработчик нативных сообщений между расширением и macOS приложением
- Функции:
beginRequest(with:): Обработка сообщений отbrowser.runtime.sendNativeMessage
- Назначение: Конфигурация расширения по стандарту WebExtensions API
- Ключевые настройки:
content_scripts: Инъекцияcontent.jsиtooltip.cssна все страницыpermissions: Доступ к clipboard API для копирования ID и storage API для сохранения состоянияhost_permissions: Доступ ко всем URL для работы на любых доменах Битрикс24action: Конфигурация popup и иконки в панели инструментов Safari
- Назначение: Основная логика расширения - обнаружение полей Битрикс24 и показ ID
- Основные функции:
createTooltip(): Создание DOM элемента тултипа с кнопками копирования для списочных полейextractFieldId(): Извлечение ID изdata-cid,data-field-tag, атрибутаnameинпута в форматеUSER_FIELDS[ID]илиdata-idдля канбан-колонокextractFieldName(): Извлечение названия поля из элемента.ui-entity-editor-block-title-textдля использования в имени класса Python dataclassextractSelectFieldValues(): Извлечение всех значений из списочного поля (select) с их IDisBitrix24Field(): Проверка, является ли элемент полем Битрикс24isSelectField(): Проверка, является ли поле списочным (enumeration/select)positionTooltip(): Позиционирование тултипа относительно элемента поляshowTooltip(): Отображение тултипа с ID поля (проверяет состояние расширения). Для списочных полей отображает ID и все значения с их ID, а также кнопки копирования в JSON и Python dataclass форматахhideTooltip(): Скрытие тултипаhideTooltipIfVisible(): Принудительное скрытие тултипа при выключении расширенияhandleTooltipClick(): Копирование ID в буфер обмена при кликеcopyToClipboard(): Универсальная функция копирования текста в буфер обменаtransliterate(): Транслитерация русского текста в латиницу для использования в ключах JSON и именах классов PythongenerateJSONFormat(): Генерация JSON формата для списочных полей в виде{"translit_value": "ID" // value}generatePythonDataclassFormat(): Генерация Python dataclass формата для списочных полей с классом на транслите и параметрами на транслитеshowCopySuccess(): Показ визуального подтверждения успешного копирования с возможностью кастомного сообщенияattachHandlersToFields(): Привязка обработчиков событий к полямloadExtensionState(): Загрузка состояния расширения из storageinit(): Инициализация расширения и настройка MutationObserver- Обработчик сообщений
extensionStateChangedдля обновления состояния в реальном времени
Алгоритм работы:
- При загрузке страницы проверяется наличие элементов Битрикс24
- К найденным полям добавляются обработчики
mouseenter/mouseleave - MutationObserver отслеживает динамически добавляемые поля
- При наведении извлекается ID и показывается тултип
- Для списочных полей дополнительно извлекаются все значения с их ID и отображаются в тултипе
- При клике на тултип ID копируется в буфер обмена
- Назначение: Стилизация тултипа с ID полей
- Ключевые стили:
.bitrix24-field-id-tooltip: Основной контейнер тултипа (поддерживает многострочный текст для списочных полей).visible: Класс для показа тултипа с анимацией.copied: Состояние после успешного копирования.tooltip-id: Стили для отображения ID (моноширинный шрифт, поддерживает многострочный текст).tooltip-icon: Иконка копирования.tooltip-buttons: Контейнер для кнопок копирования в JSON и Python форматах (отображается только для списочных полей).copy-btn: Стили кнопок копирования (JSON и Python)
- Назначение: Background script для обработки событий расширения
- Текущая функциональность: Базовая обработка сообщений между компонентами
- Назначение: Интерфейс popup расширения (открывается при клике на иконку в панели инструментов)
- Основные функции:
loadExtensionState(): Загрузка состояния расширения из storagesaveExtensionState(): Сохранение состояния расширения и отправка сообщений во все вкладкиupdateUI(): Обновление интерфейса в зависимости от состояния расширения- Переключатель включения/выключения расширения
- Отображение текущего статуса (Включено/Выключено)
- Назначение: Локализация текстов интерфейса расширения
- Содержимое: Название и описание расширения
- Назначение: Конфигурация расширения для Chrome (Manifest V3)
- Ключевые настройки:
manifest_version: 3 (Chrome MV3)background.service_worker: Использует service worker вместо background scriptscontent_scripts: Инъекцияcontent.jsиtooltip.cssна все страницыpermissions: Доступ к clipboard API для копирования ID и storage API для сохранения состоянияhost_permissions: Доступ ко всем URL для работы на любых доменах Битрикс24action: Конфигурация popup и иконки в панели инструментов Chrome
- Назначение: Service worker для обработки событий расширения в Chrome MV3
- Особенности: Использует
chrome.runtimeAPI с fallback наbrowser.runtimeдля совместимости - Текущая функциональность: Базовая обработка сообщений между компонентами
- Назначение: Основная логика расширения - обнаружение полей Битрикс24 и показ ID
- Функциональность: Идентична Safari версии, использует
chrome.storageAPI с fallback наbrowser.storage
- Назначение: Интерфейс popup расширения (открывается при клике на иконку в панели инструментов Chrome)
- Основные функции: Идентичны Safari версии, адаптированы для использования
chromeAPI вместоbrowserAPI
- Назначение: Стилизация тултипа с ID полей
- Функциональность: Идентична Safari версии
- Назначение: Локализация текстов интерфейса расширения
- Содержимое: Название и описание расширения
flowchart TD
Safari[Safari Browser] --> ContentScript[content.js]
ContentScript --> DOM[DOM страницы Битрикс24]
DOM --> Fields[Поля сущностей]
Fields -->|mouseenter| ContentScript
ContentScript -->|проверка состояния| ExtensionState{Расширение<br/>включено?}
ExtensionState -->|да| Tooltip[Тултип с ID]
ExtensionState -->|нет| NoAction[Ничего не делать]
Tooltip -->|click| Clipboard[Clipboard API]
ContentScript -->|MutationObserver| DOM
App[macOS App] --> ExtensionHandler[SafariWebExtensionHandler]
ExtensionHandler <--> Background[background.js]
Background <--> ContentScript
Popup[popup.html] -->|переключение| Storage[browser.storage.local]
Storage -->|состояние| Popup
Popup -->|сообщение| ContentScript
Storage -->|загрузка состояния| ContentScript
-
Инициализация:
- Safari загружает расширение
content.jsинжектится на страницу- Загружается состояние расширения из storage (по умолчанию включено)
- Проверяется наличие элементов Битрикс24
- Настраивается MutationObserver
- Настраивается обработчик сообщений для обновления состояния
-
Управление состоянием:
- Пользователь может включить/выключить расширение через popup
- Состояние сохраняется в
browser.storage.localс ключомbitrix24FieldIdEnabled - При изменении состояния отправляются сообщения во все вкладки
- Content script обновляет состояние и скрывает тултип при выключении
-
Обнаружение полей:
- Поиск элементов с классом
.ui-entity-editor-content-block - Проверка наличия атрибутов
data-cidилиdata-field-tag - Привязка обработчиков событий (только если расширение включено)
- Поиск элементов с классом
-
Показ ID:
- При наведении курсора проверяется состояние расширения
- Если расширение выключено, тултип не показывается
- Если включено, извлекается ID из атрибутов
- Для списочных полей (enumeration/select) дополнительно извлекаются все значения из
<select>с их ID - Создается/обновляется тултип с ID поля (для списочных полей - ID и все значения в формате "ID: значение")
- Тултип позиционируется относительно элемента поля (не курсора)
- Позиция тултипа фиксирована относительно элемента, что позволяет навести на него курсор
-
Копирование:
- При клике на тултип ID копируется через Clipboard API
- Для списочных полей доступны дополнительные кнопки копирования:
- JSON формат: Генерирует JSON объект с ключами на транслите значений и ID в качестве значений, с комментариями оригинальных значений
- Python dataclass формат: Генерирует Python dataclass класс с именем на транслите названия поля (извлекается из
.ui-entity-editor-block-title-text), параметрами на транслите значений и ID в качестве значений по умолчанию. Если название поля не найдено, используется транслитерированный ID поля
- Показывается визуальное подтверждение с возможностью кастомного сообщения
- Fallback метод для старых браузеров через
document.execCommand
- Основной селектор:
.ui-entity-editor-content-block[data-cid] - Альтернативный: элементы с
data-field-tagвнутри.ui-entity-editor-content-block - Поля с инпутами USER_FIELDS[ID]: элементы с классом
.tasks-uf-panel-row,.js-id-item-set-itemили содержащие инпут с атрибутомnameв форматеUSER_FIELDS[ID] - Канбан-колонки: элементы с классом
.main-kanban-column-bodyи атрибутомdata-id - Списочные поля:
.ui-entity-editor-content-block-field-custom-selectили.ui-entity-editor-content-block-field-enumerationс вложенным<select>- Элементы с
data-items:.main-ui-control.main-ui-selectили любой элемент с атрибутомdata-items, содержащим JSON массив значений - Popup-списки:
.popup-select-contentили.main-ui-select-innerс элементами.main-ui-select-inner-item[data-item] - UI Selector Dialog:
.ui-selector-dialogс элементами.ui-selector-item-titleвнутри.ui-selector-item-box
data-cid- основной атрибут (приоритет)data-field-tag- запасной вариант- Атрибут
nameинпута в форматеUSER_FIELDS[ID]- для полей в структуре tasks-uf-panel-row и подобных (извлекается ID из скобок) data-id- для канбан-колонок (элементы с классом.main-kanban-column-body)
- Фиксированное позиционирование относительно элемента поля (не курсора)
- Позиционирование всегда слева от элемента поля
- Смещение на 12px от границы элемента
- Если не помещается слева полностью, тултип остается слева, но сдвигается так, чтобы быть максимально видимым
- Автоматическая корректировка по вертикали: если не помещается снизу - сверху
- Минимальные отступы 10px от краев viewport
- Тултип не следует за курсором, что позволяет навести на него курсор для клика
- Автоматическое определение списочных полей по классам
ui-entity-editor-content-block-field-custom-selectили наличию<select>элемента - Поддержка четырех форматов списочных полей:
- Обычный select: значения извлекаются из
<option>элементов с атрибутомvalue - Элемент с data-items: значения извлекаются из атрибута
data-itemsэлемента (обычно.main-ui-control.main-ui-select), содержащего JSON массив объектов с полямиNAME,VALUEиIS_SELECTED - Popup-список с data-item: значения извлекаются из элементов
.main-ui-select-inner-itemс атрибутомdata-item, содержащим JSON с полямиNAMEиVALUE - UI Selector Dialog: значения извлекаются из элементов
.ui-selector-item-titleвнутри.ui-selector-dialog. ID ищется в data-атрибутах элементов (data-id, data-value), при отсутствии используется индекс элемента
- Обычный select: значения извлекаются из
- Извлечение всех значений с их ID через функцию
extractSelectFieldValues()(приоритет: ui-selector-dialog, затем элементы с data-items, затем popup-списки с data-item, затем обычные select) - Отображение в тултипе: первая строка - ID поля, последующие строки - все значения в формате "ID: значение"
- Поддержка многострочного отображения через CSS свойство
white-space: pre-line - Для списочных полей отображаются кнопки копирования в JSON и Python dataclass форматах:
- JSON формат:
{"translit_value": "ID" // value}- ключи на транслите значений, значения - ID, комментарии - оригинальные тексты - Python dataclass формат: Класс с именем на транслите названия поля (извлекается из
.ui-entity-editor-block-title-text), параметрами на транслите значений, значениями по умолчанию - ID, комментарии - оригинальные тексты. Если название поля не найдено, используется транслитерированный ID поля
- JSON формат:
- Транслитерация русского текста в латиницу выполняется функцией
transliterate()для использования в ключах JSON и именах классов/параметров Python - Название поля извлекается функцией
extractFieldName()из элемента.ui-entity-editor-block-title-textвнутри блока поля
- MutationObserver отслеживает добавление новых элементов в DOM
- При обнаружении новых полей автоматически добавляются обработчики
- Проверка выполняется с задержкой для оптимизации производительности
- JSON формат:
{"translit_value": "ID" // value}- ключи на транслите значений, значения - ID, комментарии - оригинальные тексты - Python dataclass формат: Класс с именем на транслите названия поля (извлекается из
.ui-entity-editor-block-title-text), параметрами на транслите значений, значениями по умолчанию - ID, комментарии - оригинальные тексты. Если название поля не найдено, используется транслитерированный ID поля