Виджеты

Виджеты дают приложению возможность добавить HTML и JS-код в определенное место интерфейса Мегаплана.

Содержимое виджета помещается на страницу в выбранный плейсхолдер, т.е. тело виджета интерпретируется как HTML код.

Для вставки стилей или скриптов необходимо использовать соответствующие теги <style> и <script>.

Виджет работает в неглобальной области, поэтому объявление локальной функции и дальнейшее использование её в атрибутах html тега работать не будет.

В теле виджета можно использовать APIv3 запросы (авторизация будет проходить по cookies под текущим пользователем системы, у которого загружен виджет.

Внешний вид окна редактора виджетов:

../_images/widget_editor.png

Загрузка внешнего CSS-файла

a9n.css("https://cdn.jsdelivr.net/jquery.suggestions/16.5.2/css/suggestions.css");

Загрузка внешнего JavaScript-файла

a9n.js("https://cdn.jsdelivr.net/jquery.suggestions/16.5.2/js/jquery.suggestions.min.js").then(function() {
    console.log('JS loaded');
});

Получение информации о текущем пользователе

a9n.user().then(function(current_user) {
    console.log('Current user:', current_user);
});

Подписаться на события: виджет добавлен на страницу/убран со страницы

Если виджет отображается в новом (single-page) интерфейсе, то нужно учитывать, что блок с кодом виджета - динамический. Это значит, что он может быть добавлен уже после того, как вся страница полностью загрузилась. Аналогично блок с кодом виджета может быть убран со страницы, хотя сама страница при этом не будет перезагружена. Чтобы javascript код был в курсе того, что происходит с блоком виджета, нужно подписаться на события «componentDidMount» и «componentWillUnmount».

a9n.subscribe(this,'componentDidMount', function(){
    // блок с html виджета отобразился
    // здесь можно начинать что-то с ним делать
})

a9n.subscribe(this,'componentWillUnmount', function(){
    // мы собираемся убрать блок с html виджета
    // здесь нужно освободить ресурсы и удалить html виджета вне блока (если есть)
})

Получение информации о виджете

Метод возвращает объект с параметром instance, который является DOM-элементом, в котором находится текст виджета.

console.log(a9n.widget());

Пример виджета

В качестве примера виджета, можно рассмотреть отображение подсказок из сервиса DaData , использующее их jQuery-плагин.

<style>
    #js-contractor-company-name {
        width: 400px;
    }

    .dadata_container {
        width: 390px;
        font-size: 12px;
        background: #f0f0f0;
        padding: 5px;
    }

    .dadata_container dt,
    .dadata_container dd {
        padding-bottom: 5px;
    }

    .dadata_container dt {
        font-weight: bold;
    }
</style>
<script type="text/javascript">
    a9n.css("https://cdn.jsdelivr.net/jquery.suggestions/16.5.2/css/suggestions.css")
    a9n.js("https://cdn.jsdelivr.net/jquery.suggestions/16.5.2/js/jquery.suggestions.min.js").then(function () {
        var $container = $('<dl class="dadata_container"></dl>').insertAfter("#js-contractor-company-name")
        $("#js-contractor-company-name").suggestions({
            serviceUrl: "https://suggestions.dadata.ru/suggestions/api/4_1/rs",
            token: "<Ваш токен DaData>",
            type: "PARTY",
            count: 5,
            onSelect: function (suggestion) {
                var data = suggestion.data;
                $container.html('').append($('<dt><strong>' + data.opf.short + ' ' + data.name.full + '</strong></dt>'), $('<dt>Адрес</dt>'), $('<dd>' + data.address.value + '</dd>'), $('<dt>' + data.management.post + '</dt>'), $('<dd>' + data.management.name + '</dd>'), $('<dt>КПП</dt>'), $('<dd>' + data.kpp + '</dd>'), $('<dt>ИНН</dt>'), $('<dd>' + data.inn + '</dd>'), $('<dt>ОГРН</dt>'), $('<dd>' + data.ogrn + '</dd>'), $('<dt>Статус</dt>'), $('<dd>' + data.state.status + '</dd>'));
            }
        });
    });
</script>