Документация BILLmanager 6

Менеджер темы

Менеджер темы — глобальный объект, который отслеживает состояния и события темы. Он позволяет выполнять дополнительные действия после возникновения событий или изменений состояния. Например, собирать информацию о действиях клиента в теме для дальнейшей аналитики.

Настройки из статьи применимы, если у вас у установлена официальная тема BILLmanager. Подробнее о том, как создать свою тему, см. статью Создание темы .

Инициализация менеджера

Объект менеджера доступен в глобальном объекте window под названием ISPDragonManager. Этот объект не становится доступным мгновенно. Чтобы дождаться его создания, рекомендуется отслеживать событие ISPDragonManagerLoaded, которое срабатывает при готовности объекта менеджера. В данных события ISPDragonManagerLoaded содержится объект менеджера.

Чтобы получить объект менеджера, используйте шаблон: 

function handlerManager(manager) {
    // работа с менеджером
}

// если код выполнился после того, как менеджер был создан, объект ISPDragonManager доступен в объекте `window`
if (window.ISPDragonManager) {
    handlerManager(window.ISPDragonManager);
} else {
    // если менеджер ещё не создан на момент исполнения кода, дождитесь выполнения события `ISPDragonManagerLoaded`
    window.addEventListener('ISPDragonManagerLoaded', event => {
        // в данных события лежит объект менеджера
        const manager = event.detail;
        handlerManager(manager);
    });
}

События

Менеджер позволяет отслеживать общие события, которые происходят в теме:

  • http-response — получение ответа на запрос;
  • action — выполнение действия. Например, нажатие на кнопку;
  • form-submit — успешная отправка формы;
  • form-view-init — инициализация формы;
  • form-destroy — закрытие формы;
  • form-wizard — переход на wizard (мастер) или уход с него.

Тип события http-response

Происходит, когда HTTP-ответ приходит от сервера.

Объект события включает следующие свойства:

Название свойстваОписаниеЗначения
responseответ от сервераобъект
requestParamsпараметры запроса, на который пришёл ответ от сервераобъект
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Тип события action

Происходит при внутренних событиях темы: 

  • нажатие на кнопку;
  • нажатие на внутреннюю ссылку, т.е. ссылку с атрибутом @internal="yes".

В зависимости от типа события, его объекты содержат свойства:

Объект события "Нажатие на кнопку"

Название свойстваОписаниеЗначения
actionTypeтип действия, выполненного пользователемbuttonClick
contextFuncимя функции активной вкладки платформы, на которой была нажата кнопкастрока
nameимя нажатой кнопки. Соответствует атрибуту кнопки @nameстрока
typeтип нажатой кнопки. Соответствует атрибуту кнопки @typeстрока
funcимя функции нажатой кнопки. Соответствует атрибуту кнопки @funcстрока или undefined
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Объект события "Нажатие на внутреннюю ссылку"

Название свойстваОписаниеЗначения
actionTypeтип действия, выполненного пользователемinternalLink
contextFuncимя функции активной вкладки платформы, на которой была нажата ссылкастрока
paramsобъект, в котором содержатся параметры внутренней ссылки, заданные в атрибуте ссылки @internalобъект
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Тип события form-submit

Происходит при успешной отправке формы. Если форма не прошла валидацию, событие не произойдет.

Название свойстваОписаниеЗначения
funcимя функции, на которую была отправлена формастрока
paramsпараметры запроса, с которыми произошла отправка формыобъект
responseответ от сервераобъект
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Тип события form-view-init

Происходит при первичной инициализации формы. После этого события можно взаимодействовать с DOM-элементами формы.

Если внутри одной формы изменяется объект doc, событие form-view-init произойдёт повторно. Объект события будет содержать новый объект formGroup и новое свойство contextFunc.
Название свойстваОписаниеЗначения
formIdid инициализированной формыстрока
contextFuncимя функции формыстрока
formGroupобъект FormGroup инициализированной формыFormGroup
formElementHTML-элемент инициализированной формыHTMLFormElement
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Тип события form-destroy

Происходит при закрытии формы.

Название свойстваОписаниеЗначения
formIdid закрытой формыстрока
contextFuncимя функции формыстрока
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Тип события form-wizard

Происходит, когда пользователь входит на Форму-мастер (wizard) или покидает её после успешной отправки формы на последнем шаге.

Объект события "Открытие первого шага wizard"

Название свойстваОписаниеЗначения
typeтип событияstart
funcимя функции первого шага wizardстрока
paramsпараметры запроса, с которыми был открыт первый шаг wizardобъект
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Объект события "Успешная отправка формы на последнем шаге wizard"

Название свойстваОписаниеЗначения
typeтип событияend
funcимя функции, на которую была отправлена формастрока
paramsпараметры запроса, с которыми была отправлена формаобъект
activeDocобъект, соответствующий корневому тегу doc активной вкладки платформы. Подробнее см. статью Создание темыобъект
activeContextIdid текущего активного контекстастрока

Методы работы с событиями

Ниже перечислены методы объекта менеджера, которые позволяют работать с событиями темы.

addListener(eventName, callback) 

Позволяет задать функцию, которая будет выполняться при возникновении события, указанного в первом аргументе.

АргументОписание

eventName

строка с названием события, при котором должна выполниться переданная функция

callback

функция, вызываемая каждый раз при возникновении события с именем, указанным в eventName. Первым аргументом принимает объект события

Функция возвращает undefined.

removeListener(eventName, callback) 

Удаляет переданную функцию из обработчиков события с именем, указанным в eventName. После этого функция больше не будет вызываться при возникновении события с таким именем.

АргументОписание

eventName

строка с названием события, с которого нужно удалить функцию

callback

функция, которую нужно удалить из обработчиков события, указанного в eventName

Функция возвращает undefined.

listenToEvent$(eventName) 

Позволяет получить объект класса Observable , который срабатывает при возникновении события с именем, указанным в eventName.

АргументОписание

eventName

строка с названием события, за которым нужно следить

Функция возвращает объект класса Observable, который отправляет объект события.

Примеры использования

Приведённые примеры будут выполнены в том случае, если существует глобальный объект менеджера (подробнее см. раздел "Инициализация менеджера").

Ниже приведён пример добавления и удаления обработчика события http-response:

// функция-обработчик
const callback = (event) => {
    // обработчик получает объект события
    console.log('Объект события http-response', event);
    // удаляем обработчик
    window.ISPDragonManager.removeListener('http-response', callback);
};
// добавляем обработчик на событие `http-event`
window.ISPDragonManager.addListener('http-response', callback);

В примере ниже приведена подписка на объект Observable события action:

// подписка на событие `action`
window.ISPDragonManager.listenToEvent$('action').subscribe(event => {
    // поток отправляет объект события
    console.log('Объект события action', event);
});

Состояния

Менеджер позволяет получать состояния темы и их изменения:

  • active-doc — тег doc активной вкладки платформы;
  • user-real-level — уровень пользователя в панели;
  • active-context-id — id текущего активного контекста.

Состояние active-doc 

Объект, соответствующий корневому тегу doc активной вкладки платформы.

Состояние user-real-level

Текущий уровень пользователя представлен целым числом. Соответствует атрибуту @level из первого элемента doc.path. Таким образом определяется уровень корневого пользователя.

Состояние active-context-id 

Строка, соответствующая  id  текущего активного контекста. Например, id  активной вкладки. Позволяет однозначно различать элементы на странице, если, например, открыто несколько одинаковых вкладок.

Методы работы с состоянием

Ниже перечислены методы объекта менеджера, которые позволяют работать с состояниями темы.

getState(stateName) 

Позволяет синхронно получить текущее значение состояния, указанного в stateName.

АргументОписание
stateNameстрока с названием состояния, которое нужно получить

Функция возвращает значение состояния.

addWatcher(stateName, watcher) 

Позволяет добавить функцию, вызываемую сразу после её добавления с текущим значением состояния, а также при каждом последующем изменении этого значения.

АргументОписание
stateNameстрока с названием состояния, за которым нужно следить
watcher

функция, принимающая первым аргументом значение состояния. Она будет вызвана сразу после вызова метода addWatcher и при каждом последующем изменении состоянии с именем, указанном в stateName

Функция возвращает undefined.

removeWatcher(stateName, watcher)

Удаляет функцию слежения за изменением значения состояния с именем, указанным в stateName.

АргументОписание
stateNameстрока с названием состояния, с которого нужно удалить функцию
watcher

функция, которую нужно удалить из слушателей события с именем, указанным в stateName

Функция возвращает undefined.

watchForState$(stateName, options?)

Позволяет получить объект класса Observable, который будет срабатывать при изменении значения состояния с именем, указанным в stateName. При подписке этот Observable сразу отправит текущее значение состояния. Затем он будет возвращать значение состояния при каждом его изменении.

АргументОписание
stateNameстрока с названием состояния, за которым нужно следить

options

объект с дополнительными опциями для настройки объекта класса Observable. Объект содержит только одно свойство skipFirst?: boolean. Если оно установлено в true, то Observable будет возвращать значение только при изменении состояния и не будет возвращать значение сразу после подписки на него

Функция возвращает объект класса Observable, который отправляет значение состояния.

Примеры использования

Приведённые примеры будут выполнены в том случае, если существует глобальный объект менеджера (подробнее см. раздел "Инициализация менеджера").

В примере ниже приведено синхронное получение уровня пользователя:

// получаем значение состояния `user-real-level`
const currentUserLevel = window.ISPDragonManager.getState('user-real-level');
console.log(currentUserLevel);

В примере ниже показано, как добавить и удалить слушателя состояния:

// функция-обработчик
const callback = (currentDoc) => {
    // обработчик первым аргументом получает значение состояния
    console.log('Значение состояния active-doc', currentDoc)
    // удаление обработчика
    window.ISPDragonManager.removeWatcher('active-doc', callback);
};
// добавление обработчика. При добавлении обработчика он будет вызван немедленно. Далее будет вызываться на каждое изменение состояния
window.ISPDragonManager.addWatcher('active-doc', callback);

В примере ниже показано, как подписаться на объект Observable состояния user-real-level:

window.ISPDragonManager.watchForState$('user-real-level').subscribe(userLevel => {
    // уровень пользователя будет выведен в консоль сразу после подписки, и при каждом изменении состояния
    console.log(userLevel)
});

При установке значения опции skipFirst: true, поток будет отправлять значения состояния только при его изменении и не будет отправлять значение сразу после подписки на него:

window.ISPDragonManager.watchForState$('user-real-level', { skipFirst: true }).subscribe(userLevel => {
    // уровень пользователя будет выведен в консоль только при изменении состояния
    console.log(userLevel)
});
Может быть полезно

Связанные статьи: