Примеры использования виджета типа «HTML»

Примеры получения данных модели в виджете типа «HTML» представлены в таблице ниже (Таблица «Примеры получения данных модели в виджете типа «HTML»).

Таблица 1. Примеры получения данных модели в виджете типа «HTML»

Вид представления Вид данных Пример Скрипты
Плоская таблица Все значения столбца Расположить по горизонтали

Скрипт HTML:


                                                          
<div class="t1">
    <div id="value"></div>
</div>

                                                          

Скрипт CSS:


                                                          
.t1 {
    background: #43b37091;
    padding: 16px;
    border-radius: 16px;
    overflow: auto;
    width: auto;
    height: auto;
    display: inline-flex;
}

                                                          

Скрипт JS:


                                                          
function setValue(element, fieldName) {
    element.innerHTML = window.DATA.data.map(field => field[fieldName].value).toString();
    console.log(window.data.data.map(field => field[fieldName].value).toString());
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
    var value = document.getElementById('value');
    setValue(value, 'mark_value');
}
Расположить по вертикали

Скрипт HTML:


                                                          
<div class="t1">
    <div id="value"></div>
</div>

                                                          

Скрипт CSS:


                                                          
.t1 {
    background: #4fa06f91;
    padding: 16px;
    border-radius: 16px;
    overflow: auto;
    width: auto;
    height: auto;
    display: inline-flex;
    flex-direction: column;
}

                                                          

Скрипт JS:


                                                          
function setValue(element, fieldName) {
    element.innerHTML = '';

                                                          
    window.DATA.data.forEach(field => {
        const newRow = document.createElement('tr');
        newRow.innerHTML = field[fieldName].value.toString();

                                                          
         element.appendChild(newRow);
    })
} function render() {
    console.log(window.daDATAta);

                                                          
    var value = document.getElementById('value');
    setValue(value, 'mark_value');
}
Конкретные значения столбца  

Скрипт HTML:


                                                          
<div class="t1">
    <div id="value"></div>
</div>

                                                          

Скрипт CSS:


                                                          
.t1 {
    background: #57ad7991;
    padding: 16px;
    border-radius: 16px;
    width: auto;
    height: auto;
    display: inline-flex;
}

                                                          

Скрипт JS:


                                                          
function setValue(element, valueIndex, fieldName) {
    const fieldData = window.DATA.data[valueIndex];
    if (fieldData) {
        const value = fieldData[fieldName].value;
        if (value) {
            element.innerHTML = value
        } else {
            element.innerHTML = 0;
        }
    } else {
        element.innerHTML = 0;
    }
}

                                                          

                                                          
  function render() {
    var value = document.getElementById('value');
    setValue(value, 1, 'calc__god');
}
  Итоговый агрегат  

Скрипт HTML:


                                                          
<div class="t1">
    <div id="diff"></div>
</div>

                                                          

Скрипт CSS:


                                                          
.t1 {
    background: #43b37091;
    padding: 16px;
    border-radius: 16px;
    overflow: auto;
    width: auto;
    height: auto;
    display: inline-flex;
}

                                                          

Скрипт JS:


                                                          
function setTotal(element, fieldName) {
    const fieldData = window.DATA.total[fieldName];
    if (fieldData) {
        const value = fieldData.agg_value
        if (value) {
            element.innerHTML =value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
        } else {
            element.innerHTML = 0 ;
        }
    } else {
        element.innerHTML = 0;
    }
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
     var diff = document.getElementById('diff');
     setTotal(diff, 'mark_value');
}
Сгруппированная таблица (группировка по группам-строк) Все значения поля групп-строк первого уровня Расположить по горизонтали

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">
          Распределение учеников и классов по учебным сменам
        </div>
    </div class="trend__body">
      <table id="group_first"></table>
</div>
</div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
  box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    padding: 10px 10px 8px 25px;
    border-radius: 16px;
    width: auto;
    height: auto;
    display: inline-flex;
    flex-direction: column;
    background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
}
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
.trend__name {
    font-weight: 500;
    font-size: 18px;
    line-height: px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
}

                                                          

Скрипт JS:


                                                          
function setGroup(element, fieldName) {

                                                          
    element.innerHTML = window.DATA.data.map(field => field[fieldName].value).toString();
    console.log(window.data.data.map(field => field[fieldName].value).toString());
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
    var groupFirst = document.getElementById('group_first');
    setGroup(groupFirst, 'd_school_shift__value');
}
Расположить по вертикали

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">
          Распределение учеников и классов по учебным сменам
        </div>
    </div class="trend__body">
    <table id="group_first"></table>
    </div>
</div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
  box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    padding: 10px 10px 8px 25px;
    border-radius: 16px;
    width: auto;
    height: auto;
    display: inline-flex;
    flex-direction: column;
    background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
}
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
.trend__name {
    font-weight: 500;
    font-size: 18px;
    line-height: px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
}

                                                          

Скрипт JS:


                                                          
function setGroup(element, fieldName) {
    element.innerHTML = '';

                                                          
    window.DATA.data.forEach(field => {
        const newRow = document.createElement('tr');
        newRow.innerHTML = field[fieldName].value;
        element.appendChild(newRow);
    })
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
    var groupFirst = document.getElementById('group_first');
    setGroup(groupFirst, 'd_school_shift__value');
}
Конкретное значение групп-строк  

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">
          Распределение учеников и классов по учебным сменам
        </div>
      </div class="trend__body">
    <div class="trend__first" id="group_first" > </div>
   </div>
  </div>
 </div>

                                                          

Скрипт CSS:


                                                          
.trend {
    box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    padding: 10px 10px 8px 25px;
    border-radius: 16px;
    width: 400px;
    height: auto;
    display: inline-flex;
    flex-direction: column;
    background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
}

                                                          
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
.trend__name {
    font-weight: 500;
    font-size: 18px;
    line-height: px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
}

                                                          
.trend__first {
    font-weight: 500;
    font-size: 16px;
    line-height: 35px;
    letter-spacing: -0.005em;
    white-space: nowrap;
}

                                                          

Скрипт JS:


                                                          
function setGroup(element, valueIndex, fieldName) {
    const fieldData = window.DATA.data[valueIndex];

                                                          
     if (fieldData) {
        const value = fieldData[fieldName].value;
        if (value) {
            element.innerHTML = value;
        } else {
            element.innerHTML = 'Нет группы';
        }
    } else {
        element.innerHTML = 'Нет группы';
    }
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
     var groupFirst = document.getElementById('group_first');

                                                          
     setGroup(groupFirst,  2, 'd_school_shift__value');
}
Промежуточный агрегат первого уровня Расположить по горизонтали

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">
          Распределение учеников и классов по учебным сменам
        </div>
    </div class="trend__body">
    <table id="group_first"></table>
</div>
</div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
  box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    padding: 10px 10px 8px 25px;
    border-radius: 16px;
    width: auto;
    height: auto;
    display: inline-flex;
    flex-direction: column;
    background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
}
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
.trend__name {
    font-weight: 500;
    font-size: 18px;
    line-height: px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
}
#agg-value-1
{
    display: flex;
}

                                                          

Скрипт JS:


                                                          

                                                          
function setGroup(element, fieldName) {

                                                          
    element.innerHTML = window.DATA.data.map(field => field[fieldName].value).toString();
    console.log(window.data.data.map(field => field[fieldName].value).toString());
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
    var groupFirst = document.getElementById('group_first');
    setGroup(groupFirst, 'd_school_shift__value');
}
Расположить по вертикали

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">
          Распределение учеников и классов по учебным сменам
        </div>
    </div class="trend__body">
   <div id="agg-value-1"></div>
  </div>
 </div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
  box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    padding: 10px 10px 8px 25px;
    border-radius: 16px;
    max-width: 440px;
    width-min: 200px;
    height: auto;
    display: inline-flex;
    flex-direction: column;
    background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
}

                                                          
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
* {
margin: 0;
padding: 0;
}

                                                          
.trend__name {
    font-weight: 500;
    font-size: 18px;
    line-height: px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
}

                                                          

Скрипт JS:


                                                          
function getAggValue(fieldName, columnIndex) {
    const element = document.getElementById(columnIndex);
    element.innerHTML = '';
    window.DATA.data.forEach(field => {
        const newRow = document.createElement('div');
        newRow.innerHTML = field[fieldName].agg_value;
        element.appendChild(newRow);
    })
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
    ['child_cnt'].forEach((field, index) => {
    getAggValue(field, 'agg-value-' + (index + 1));
    })
}
Конкретное значение промежуточного агрегата первого уровня  

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">
          Распределение учеников и классов по учебным сменам
        </div>
    </div class="trend__body">
   <table>
    <tr>
     <td>
    <div  > </div>
     </td>
     <td>
      <div class="trend__name2" >   Количество учеников</div>
     </td>
    </tr>
     <tr>

                                                          
     <td>
      <div class="trend__first" id="group_first" > </div>
     </td>
     <td>
      <div class="trend__secound" id ="first" > </div>
     </td>
    </tr>
    </table>
  </div>
 </div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
  box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    padding: 10px 10px 8px 25px;
    border-radius: 16px;
    width: auto;
    height: auto;
    display: inline-flex;
    flex-direction: column;
    background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
}

                                                          
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
.trend__name {
    font-weight: 500;
    font-size: 18px;
    line-height: px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__name2 {
    font-weight: 500;
    font-size: 14px;
    line-height: 15px;
    flex: 1;
    padding-right: 8px;
    font-weight: 700;
    text-align: center;
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
}

                                                          
.trend__first {
    font-weight: 500;
    font-size: 16px;
    line-height: 35px;
    letter-spacing: -0.005em;
    white-space: nowrap;
}

                                                          
.trend__secound {
    font-size: 18px;
    line-height: 22px;
    color: #5f6773;
    align-items: center;
    white-space: nowrap;
    text-align: center;
}

                                                          

Скрипт JS:


                                                          
function setValue(element, valueIndex, fieldName) {
    const fieldData = window.DATA.data[valueIndex];
    if (fieldData) {
        const value = fieldData[fieldName].agg_value;
        if (value) {
            console.log(value);
            element.innerHTML = value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
        } else {
            element.innerHTML = 0;
        }
    } else {
        element.innerHTML = 0;
    }
}

                                                          
function setGroup(element, valueIndex, fieldName) {
    const fieldData = window.DATA.data[valueIndex];

                                                          
     if (fieldData) {
        const value = fieldData[fieldName].value;
        if (value) {
            element.innerHTML = value;
        } else {
            element.innerHTML = 'Нет группы';
        }
    } else {
        element.innerHTML = 'Нет группы';
    }
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
     var groupFirst = document.getElementById('group_first');
     var first = document.getElementById('first');

                                                          
     setGroup(groupFirst,  2, 'd_school_shift__value');
    setValue(first, 2, 'child_cnt');
}
  Итоговый агрегат   Аналогично получению итогового агрегата из плоской таблицы  

Пример реализации виджета типа «HTML представлены в таблице ниже (Таблица «Пример реализации виджета типа «HTML»).

Примечание
Для масштабирования виджета типа «HTML» в информационной панели аналогично другим виджетам укажите в главном контейнере размеры 100% (width: 100%; height: 100%).

Таблица 2. Пример реализации виджета типа «HTML»

Наименование Пример Табличное представление Скрипты

Тренд со значения, цвет которых зависит от их величины

Также с помощью JS реализована обработка получения пустоты при фильтрации – вместо пустоты отображается 0 в виджете:

Отфильтрованная таблица – в результате пустота:

Скрипт HTML:


                                                          
<div class="trend">
    <div class="trend__head">
        <div class="trend__name">Процент 1</div>
        <div class="trend__name">Процент 2</div>
        <div class="trend__name">Процент 3</div>
    </div>

                                                          
    <div class="trend__body">
         <div id="diff1" class="trend__name2"></div>
         <div id="diff2" class="trend__name2"></div>
        <div id="diff3" class="trend__name2"></div>
</div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
    background-image: url(v904-nunny-012.jpg) ;
    background-size: no-repeat;
    background-position: center;
    background-size: cover;
    border: 1px solid #d6dde5;
    padding: 16px;
    border-radius: 16px;
    overflow: auto;
    width: 400px;
    height: 120px;
    display: inline-flex;
    flex-direction: column;
     background: #ffffff ;
    }
.trend__head {
    display: flex;
    flex: 1;
    margin-bottom: 16px;
}

                                                          
.trend__name {
    font-weight: 400;
    font-size: 14px;
    line-height: 17px;
    flex: 1;
    padding-right: 8px;
}

                                                          
.trend__name2 {
    font-weight: 500;
    font-size: 25px;
    line-height: 17px;
    flex: 1;
    text-shadow:   1px 1px 1px rgb(100, 97, 97);
}

                                                          
.trend__body {
    display: flex;
    align-items: flex-end;
    flex-direction: row;
}

                                                          

Скрипт JS:


                                                          
function setTotal(element, fieldName) {
    const fieldData = window.DATA.total[fieldName];
    var value = 0;

                                                          
    if (fieldData) {
        value = fieldData.agg_value;
        if (value) {
            element.innerHTML = parseFloat(value).toFixed(2) + ' %';
        } else {
            element.innerHTML = 0 + ' %';
        }
    } else {
        element.innerHTML = 0 + ' %';
    }

                                                          
    if (value <= 33) {
        element.style.color = 'red';
    } else if (value > 33 && value <= 66) {
        element.style.color = 'yellow';
    } else if (value > 66) {
        element.style.color = 'green';
    }
}

                                                          
function render() {
    console.log(window.DATA);

                                                          
    var diff1 = document.getElementById('diff1');
    var diff2 = document.getElementById('diff2');
    var diff3 = document.getElementById('diff3');

                                                          
    setTotal(diff1, 'procent_1');
    setTotal(diff2, 'procent_2');
    setTotal(diff3, 'procent_3');
}

Отображение окна с информацией

Примечание – Данные в окне с информацией отображаются из окна настройки «Информация о виджете» на вкладке «Вид»

Скрипт HTML:


                                                          
<div class="trend">

                                                          
 <div class="trend__body">
 <div id="first" class="trend__first" > </div>
 <div class="trend__first" > чел . </div>
 </div>

                                                          
<div class="trend__head">
 <div class="trend__name">
 Количество учителей
 </div>
 </div>

                                                          
 <div class="wrapper">
 <div class="hint" id="hint-button">
 <div class="hint-text" id="hint-text"></div>
 <svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="16px" height="16px">
 <path d="M8 7.4a.6.6 0 0 0-.6.6v2.4a.6.6 0 0 0 1.2 0V8a.6.6 0 0 0-.6-.6Zm.228-2.352a.6.6 0 0 0-.456 0 .6.6 0 0 0-.198.126.69.69 0 0 0-.126.198.6.6 0 0 0 .126.654.69.69 0 0 0 .198.126.6.6 0 0 0 .654-.978.6.6 0 0 0-.198-.126ZM8 2a6 6 0 1 0 0 12A6 6 0 0 0 8 2Zm0 10.8a4.8 4.8 0 1 1 0-9.6 4.8 4.8 0 0 1 0 9.6Z"></path>
 </svg>
 </div>
 </div>
</div>

                                                          

Скрипт CSS:


                                                          
.trend {
 position: relative;
 box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
 padding: 17px 10px 17px 25px;
 border-radius: 16px;
 width: 240px;
 height: 100px;
 background: linear-gradient(to right, rgb(141,233,211) 1%, transparent 20%);
 margin-top:100px;
}

                                                          
.trend__head {
 display: flex;
 flex: 1;
}

                                                          
.trend__name {
 font-weight: 500;
 font-size: 14px;
 line-height: 17px;
 flex: 1;
 padding-right: 8px;
}

                                                          
.trend__body {
 display: flex;
 align-items: flex-end;
}

                                                          
.trend__first {
 font-weight: 700;
 font-size: 32px;
 line-height: 50px;
 letter-spacing: -0.005em;
 white-space: nowrap;
}

                                                          
.hint {
 position: relative;
 display: flex;
 align-items: center;
 justify-content: center;
 width: 24px;
 min-width: 24px;
 height: 24px;
 border-radius: 8px;
 transition: color .2s,background-color .2s;
}

                                                          
.hint:hover {
 background-color: rgba(129, 151, 182, .16);
}

                                                          
.hint:hover svg {
 color: #5f6773;
}

                                                          
.hint svg {
 color: #acb1c1;
}

                                                          
.hint-text {
 display: none;
 position: absolute;
 color: #202224;
 background: #ffffff;
 font-size: 13px;
 border-radius: 8px;
 line-height: 16px;
 border: 1px solid #d6dde5;
 padding: 16px;
 text-align: left;
 white-space: pre-wrap;
}

                                                          
.wrapper {
 position: absolute;
 top: 5px;
 right: 5px;
}

                                                          

Cкрипт JS:


                                                          
function setValue(element, valueIndex, fieldName) {
 const fieldData = window.DATA.data[valueIndex];
 if (fieldData) {
 const value = fieldData[fieldName].agg_value;
 if (value) {
 element.innerHTML = value.replace(/\B(?=(\d{3})+(?!\d))/g," ")
 } else {
 element.innerHTML = 0;
 }
 } else {
 element.innerHTML = 0;
 }
}
 function render() {
 var first = document.getElementById('first');

                                                          
 setValue(first, 0, 'dim_fio');
}

                                                          
window.onload=function(){
 const target = document.getElementById("hint-button");
 const tooltip = document.getElementById("hint-text");
  target.addEventListener('mouseover', () => {
 if (window.WIDGET.settings) {
 tooltip.innerHTML = window.WIDGET.settings.info.text || '';
 }
 const computedStyle = getComputedStyle(tooltip)
 console.log(computedStyle.height);
 tooltip.style.top = '-' + computedStyle.height;
 tooltip.style.display = 'block';
 }, false);

                                                          
 // change display to 'none' on mouseleave
 target.addEventListener('mouseleave', () => {
 tooltip.style.display = 'none';
 }, false);
}

С помощью виджета типа «HTML» есть возможность реализации виджетов из библиотеки Apache ECharts. В таблице ниже представлен пример реализованного виджета (Таблица «Пример реализованного виджета из библиотеки Apache ECharts»).

Таблица 3. Пример реализованного виджета из библиотеки Apache ECharts

Наименование Пример Табличное представление Скрипты

Ring Gauge (https://echarts.apache.org/examples/en/editor.html?c=gauge-ring)

Скрипт HTML:


                                                          
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
<div id="widget"></div>

                                                          

Скрипт CSS:


                                                          
#widget
{
    width: 100%;
    height: 100%;
}

                                                          

Скрипт JS:


                                                          
var dom = document.getElementById('widget');
var chart = echarts.init(dom, null, {
    renderer: 'canvas',
    useDirtyRect: false
});

                                                          
var app = {};

                                                          
var option = {};

                                                          
// Редендерим виджет
chart.setOption(option);

                                                          
function render() {
    const data = DATA.data.map((item, index) => {
        const position_title = index*60-100;
        const position_detail = index*60-80;
        return {
            value: Math.round(item['unrz_id']?.agg_value),
            name: item['exclude_reason']?.value,
            title: {
              offsetCenter: ['0%', position_title]
            },
            detail: {
              valueAnimation: true,
              offsetCenter: ['0%', position_detail]
            }
        }
    });

                                                          
     const option = {
        series: [
            {
            type: 'gauge',
            startAngle: 90,
            endAngle: -270,
            pointer: {
                show: false
            },
            progress: {
                show: true,
                overlap: false,
                roundCap: true,
                clip: false,
                itemStyle: {
                borderWidth: 1,
                borderColor: '#464646'
                }
            },
            axisLine: {
                lineStyle: {
                width: 40
                }
            },
            splitLine: {
                show: false,
                distance: 0,
                length: 10
            },
            axisTick: {
                show: false
            },
            axisLabel: {
                show: false,
                distance: 50
            },
            data: data,
            title: {
                fontSize: 14
            },
            detail: {
                width: 50,
                height: 14,
                fontSize: 14,
                color: 'auto',
                borderColor: 'auto',
                borderRadius: 20,
                borderWidth: 1,
                formatter: '{value}%'
            }
            }
        ]
    };

                                                          
    chart.setOption(option, false);

                                                          
}

                                                          
window.addEventListener('resize', chart.resize);