Добавление шапки в аналитическую панель

Шапка в дашбордах нужна для того, чтобы предоставить пользователю общую информацию о контексте и цели дашборда. В шапке обычно указываются название дашборда, дата и время последнего обновления данных, а также названия ключевых метрик и показателей. Это помогает пользователям быстро понимать, что они видят и какую информацию они могут получить. Кроме того, шапка может содержать ссылки на другие связанные дашборды или отчеты, что упрощает навигацию пользователя в системе. Рассмотрим, как создать и добавить шапку на дашборд в Analytic Workspace.

Подготовка структуры и данных

Создаем новый виджет с типом “HTML”.
Если в шапке необходимо отображать названия показателей, то также добавляем нужные показатели в столбцы.


Файл с логотипом можно подгрузить напрямую на сервер AW

image
На вкладке HTML создаем разметку. Шапка будет заполнять всю область виджета, создаем корневой блочный элемент с классом container. Также выделим место под логотип(.logo), название(.title) и отдельный блок для дополнительных показателей(.content). Внутри .content будем выводить список показателей и время. Загруженный логотип разместим в контейнере через тег img. Итоговая структура шапки:

<div class="container">
    <div class="logo">
        <img class="logo__img" src="aw_logo.png"></img>
    </div>
    <div class="title">
        Анализ продаж компании
    </div>
    <div class="content">
        <div class="content__indicators">

        </div>
        <div class="content__time">

        </div>
    </div>
</div>

Расположение элементов зададим через CSS, для демонстрации расположим элементы в строку. Для этого воспользуемся CSS-технологией flexbox.
Flex-элементы также делаем flex-контейнерами для удобства настройки.

.container {
    width: 100%;
    height: 100%;
    background-color: #d4dcfc;
    display: flex;
    flex-direction: row;
    justify-content: space-around;
    align-items: center;
}

.logo {
    flex: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-left: 2rem;
}

.logo__img {
    width: 100%;
}

.title {
    flex: 2;
    font-size: 2rem;
    font-weight: 600;
    display: flex;
    justify-content: center;
    align-items: center;
}

.content {
    flex: 3;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 1.2rem;
    font-weight: 400;
}

.content__indicators {
    flex: 2;
    display: flex;
    justify-content: center;
    align-items: center;
}

.content__time {
    flex: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-right: 2rem;
}

Добавление динамических элементов

Следующим шагом выведем наименования показателей в шапку. Если в данных модели есть дата последнего обновления, то ее можно вывести таким же способом. В данном случае будем выводить текущее время.
Переходим на вкладку JS. В первую очередь получим DOM элементы контента.

const content = document.querySelector('.content');
const timeContainer = document.querySelector('.content__time');
const indicatorContainer = document.querySelector('.content__indicators');

Также объявляем функцию render. Она будет вызываться при каждом изменении данных. В данном случае она необязательна, но лучше всегда придерживаться этого паттерна.

function render() {
    const columns = window.WIDGET.columns;
}

Получить данные из модели можно через глобальный объект window и его свойство WIDGET. Получаем используемые в модели названия столбцов и их алиасы. Получаем из массива с алиасами строку и записываем ее в элемент content. Также реализуем логику часов через setInterval.

function render() {
    const columns = window.WIDGET.columns;
    const columnAliases = [];
    for (let item of columns) {
        const currentField = window.WIDGET.allFields.find(field => field.model_name === item.field)
        if (currentField) {
            columnAliases.push(currentField.alias)
        }
    }
    indicatorContainer.innerHTML= columnAliases.join('<br>')
    setInterval(() => {
        timeContainer.innerHTML = `${new Date().getFullYear()}-${new Date().getMonth()}-${new Date().getDate()} ${new Date().getHours().toString().length === 1 ? `0${new Date().getHours()}`: new Date().getHours()}:${new Date().getMinutes().toString().length === 1 ? `0${new Date().getMinutes()}`: new Date().getMinutes()}:${new Date().getSeconds().toString().length === 1 ? `0${new Date().getSeconds()}`: new Date().getSeconds()}`;
    }, 1000)
}

Итоговый HTML виджет добавим на дашборд.

1 лайк