Скрипты, блоки кода и плагины


Как отключить работу скриптов в GC

Временное отключение на определенной странице: Добавьте в адресную строку страницы параметр `?offscript=1`. Например, для страницы со списком тренингов ссылка будет выглядеть так: `https://ваш_домен.getcourse.ru/teach/control/stream?offscript=1`. Это отключение действует только для пользователя, который просматривает страницу по этой ссылке.

Рекламная плашка

Рекламная плашка

Настройка рекламной плашки

Добавление ссылок через редирект

Что бы чуть упростить добавление плашки.
Просто создал две страницы редиректа и добавил их в скрипт.

Обновление рекламной плашки

Чтобы заменить плашку, необходимо:

  1. Обновить ссылку на файл с изображением.
  2. Заменить ссылку на страницу, куда будет вести плашка при нажатии.

Эти изменения нужно внести на следующих страницах редиректа:

Страница перехода при нажатии на плашку - https://fitnessmama.school/pl/cms/page/editor?id=3811815

image.png

Картинка рекламной плашки - https://fitnessmama.school/pl/cms/page/editor?id=3811801 

image.png

При загрузке картинки в хранилище, доступ должен быть настроен для всех, что бы у неавторизованных пользователей, также отображалась плашка:

image.png

Проверка отображения плашки

Что бы проверить как отображается плашка, можно открыть публично доступную страницу ГК в инкогнито.
Например: https://fitnessmama.school/trainings2 

image.png

Видео про тех. настройку плашки:

https://drive.google.com/file/d/1rkgeU2CIcbPFqO4nXksQx1WzejlSv0aE/view 

Скрыть плашку на определенных страницах

Что бы скрыть банер на определенных страницах сайта, нужно добавь путь в рабочий скрипт:
https://fitnessmama.school/pl/cms/layout/update?id=29679#js 
Обновление скрипта может занять около 15 мин.

image.png

Отображение плашки в аккаунте

Что бы плашка отображалась в GC нужно установить его темой для оформления аккаунта, но для этого нужно иметь доступ.
Статья в GC: https://getcourse.ru/blog/816432#akk
Рекламная плашка

Скрипт для плашки

image.png

JS

//РЕКЛАМНАЯ ПЛАШКА

// Чтобы исключить отображение для определенной страницы, добавьте путь в массив excludedPages через запятую.
// Например: ["/cms/system/login", "/another/page", "/some/other/page"];

const excludedPages = ["/cms/system/login", "/pl/webinar/show", "/postura_login"]; 
if (!excludedPages.includes(window.location.pathname)) {

//var chek позволяет исключить отображение в определенных блоках
	var chek = $('#ltBlock2132901984, #ltBlock2140587928,); // ID формы виджета
	var cookie_max_age = 24 * 60 * 60; //Время жизни cookie в секундах.
	var delay = 1; //Задержка показа в миллисекундах, 1000 = 1 секунде.

	if (getCookie('popup_per_day') !== 'true') {
    	setTimeout(function() {

//!window.location.href.includes('/widget/') исключает отображаение плашки во всех виджетах
    	    if (chek.length == 0 && !window.location.href.includes('/widget/')) {
        	    if ($('.gc-main-content').hasClass('with-left-menu')) {
            	    $('.gc-main-content').append('<div class="info-banner menu"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	} else {
                	$('.gc-main-content').append('<div class="info-banner"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	}
        	} else {
            	console.log('на странице форма с ГК');

        	}

        	$('.info-banner').append('<div class="close-mybtn"></div>');
      		$('.close-mybtn').click(function() {
      	    $('.info-banner').hide();
       	    setCookie('popup_per_day', 'true', { 'max-age': cookie_max_age });
       	 });
   	 }, delay);
 	};
};

//FUNCTIONS
function getCookie(name) {
    var matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ));
    return matches ? decodeURIComponent(matches[1]) : undefined;
}

function setCookie(name, value, options = {}) {

    options = {
        path: '/',
            secure: true,
            // при необходимости добавьте другие значения по умолчанию
            ...options
    };

    if (options.expires instanceof Date) {
        options.expires = options.expires.toUTCString();
    }

    var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

    for (var optionKey in options) {
        updatedCookie += "; " + optionKey;
        var optionValue = options[optionKey];
        if (optionValue !== true) {
            updatedCookie += "=" + optionValue;
        }
    }

    document.cookie = updatedCookie;
}

CSS

/* убрать баннер */
.common-banner-wrapper {
  display:none!important;
}

/* Стили для Баннер как у Геткурс */
  .info-banner {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 10px; 
    left: 10px; 
    Z-index: 9;
        overflow: hidden;
        padding: 20px;
  }
  .info-banner.menu {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 20px; 
    left: 90px; 
    Z-index: 999;
        overflow: hidden;
        padding: 20px;
  }
    .info-banner img.banner {
        border-radius: 16px; /*радиус скругления изображения*/ 
        box-shadow: 0 0 6px 2px #00000069; /*настройки тени*/
    }
.close-mybtn {
    cursor: pointer;
    position: absolute;
    width: 25px;
    height: 25px;
    top: 10px;
    right: 10px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 10px 1px #00000038;
}

.close-mybtn:before {
    content: '✕';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    color: #000;
    font-weight: bold;
    line-height: 1;
    font-size: 14px;
    padding: 6px  6.5px;
}

  @media (max-width:  920px) {
    .info-banner {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */ 
      bottom: 10px; 
      left: 0px; 
    }
    .info-banner.menu {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */  
      bottom: 50px; 
      left: 0px; 
  }
  }
/* Стили для Баннер как у Геткурс */

IMC калькулятор

image.png

Экспорт блока

eyJ0eXBlIjoiZm9ybS1ub3JtYWwiLCJwcmVzZXQiOiJmb3JtMDIiLCJwYXJhbXMiOiJ7XCJmb3JtXCI6e1wiaXRlbXNcIjp7XCJwYXJ0c1wiOntcImZpZWxkNDkzNzZcIjp7XCJpbm5lclwiOntcInZhbHVlXCI6XCIgICAgPHN0eWxlPlxcclxcbiAgICAgICAgLmNvbmZpcm0tcnVsZXMtY2hlY2tib3gge1xcclxcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgICAuYm1pLWNvbnRhaW5lciB7XFxyXFxuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcclxcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxyXFxuICAgICAgICAgICAgcGFkZGluZzogMjBweDtcXHJcXG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IDBweCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgICAgICAgICAgbWF4LXdpZHRoOiA4MDBweDtcXHJcXG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5pbnB1dC1zZWN0aW9uLFxcclxcbiAgICAgICAgLnJlc3VsdC1zZWN0aW9uIHtcXHJcXG4gICAgICAgICAgICBmbGV4OiAxO1xcclxcbiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgICAuaW5wdXQtc2VjdGlvbiB7XFxyXFxuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIGxhYmVsIHtcXHJcXG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgaW5wdXQsXFxyXFxuICAgICAgICBzZWxlY3Qge1xcclxcbiAgICAgICAgICAgIHdpZHRoOiA5MCU7XFxyXFxuICAgICAgICAgICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcclxcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XFxyXFxuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5ibWktY29udGFpbmVyIGgyIHtcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMzBweDtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5yZXN1bHQtc2VjdGlvbiBwIHtcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgLmNhbGN1bGF0ZS1idG4ge1xcclxcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gICAgICAgICAgICB3aWR0aDogOTAlO1xcclxcbiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN0JGRjtcXHJcXG4gICAgICAgICAgICBjb2xvcjogI2ZmZjtcXHJcXG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgICAuY2FsY3VsYXRlLWJ0bjpob3ZlciB7XFxyXFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNTZiMztcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5yZXN1bHQtc2VjdGlvbiBzcGFuIHtcXHJcXG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgPFxcL3N0eWxlPlxcclxcblxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJibWktY29udGFpbmVyXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImlucHV0LXNlY3Rpb25cXFwiPlxcclxcbiAgICAgICAgICAgIDxoMj5JbnRyb2R1IGRhdGVsZTxcXC9oMj5cXHJcXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJhZ2VcXFwiPlZcXHUwMGUycnN0YSAoYW5pKTo8XFwvbGFiZWw+XFxyXFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcImFnZVxcXCIgbWluPVxcXCIxXFxcIiBtYXg9XFxcIjEyMFxcXCIgcGxhY2Vob2xkZXI9XFxcIlxcXCI+XFxyXFxuXFxyXFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZ2VuZGVyXFxcIj5TZXg6PFxcL2xhYmVsPlxcclxcbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XFxcImdlbmRlclxcXCI+XFxyXFxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XFxcIm1hbGVcXFwiPkJcXHUwMTAzcmJhdDxcXC9vcHRpb24+XFxyXFxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XFxcImZlbWFsZVxcXCI+RmVtZWllPFxcL29wdGlvbj5cXHJcXG4gICAgICAgICAgICA8XFwvc2VsZWN0PlxcclxcblxcclxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImhlaWdodFxcXCI+XFx1MDBjZW5cXHUwMTAzbFxcdTAyMWJpbWUgKGNtKTo8XFwvbGFiZWw+XFxyXFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcImhlaWdodFxcXCIgbWluPVxcXCI1MFxcXCIgbWF4PVxcXCIyNTBcXFwiIHBsYWNlaG9sZGVyPVxcXCJcXFwiPlxcclxcblxcclxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcIndlaWdodFxcXCI+R3JldXRhdGUgKGtnKTo8XFwvbGFiZWw+XFxyXFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIndlaWdodFxcXCIgbWluPVxcXCIyMFxcXCIgbWF4PVxcXCIzMDBcXFwiIHBsYWNlaG9sZGVyPVxcXCJcXFwiPlxcclxcblxcclxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNhbGN1bGF0ZS1idG5cXFwiIG9uY2xpY2s9XFxcImNhbGN1bGF0ZUJNSSgpXFxcIj5DYWxjdWxlYXpcXHUwMTAzIElNQzxcXC9kaXY+XFxyXFxuICAgICAgICA8XFwvZGl2PlxcclxcblxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LXNlY3Rpb25cXFwiPlxcclxcbiAgICAgICAgICAgIDxoMj5SZXp1bHRhdDxcXC9oMj5cXHJcXG4gICAgICAgICAgICA8cD5JTUMtdWwgdFxcdTAxMDN1OjxzcGFuIGlkPVxcXCJibWktcmVzdWx0XFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgICAgIDxwPk5pdmVsOiA8c3BhbiBpZD1cXFwiYm1pLWxldmVsXFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgICAgIDxwPkRpYXBhem9udWwgc1xcdTAxMDNuXFx1MDEwM3RvczogPHNwYW4gaWQ9XFxcImhlYWx0aHktYm1pXFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgICAgIDxwPkdyZXV0YXRlIG9wdGltXFx1MDEwMzo8c3BhbiBpZD1cXFwiaGVhbHRoeS13ZWlnaHRcXFwiPi0tPFxcL3NwYW4+PFxcL3A+XFxyXFxuICAgICAgICAgICAgPHA+UmVjb21hbmRcXHUwMTAzcmk6PHNwYW4gaWQ9XFxcInJlY29tbWVuZGF0aW9uXFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgPFxcL2Rpdj5cXHJcXG4gICAgPFxcL2Rpdj5cXHJcXG5cXHJcXG4gICAgPHNjcmlwdD5cXHJcXG4gICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUJNSSgpIHtcXHJcXG4gICAgICAgICAgICBjb25zdCBhZ2UgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlJykudmFsdWUsIDEwKTtcXHJcXG4gICAgICAgICAgICBjb25zdCBnZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZGVyJykudmFsdWU7XFxyXFxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVpZ2h0JykudmFsdWUpO1xcclxcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlaWdodCcpLnZhbHVlKTtcXHJcXG5cXHJcXG4gICAgICAgICAgICBpZiAoaXNOYU4oYWdlKSB8fCBpc05hTihoZWlnaHQpIHx8IGlzTmFOKHdlaWdodCkpIHtcXHJcXG4gICAgICAgICAgICAgICAgYWxlcnQoXFxcIlZcXHUwMTAzIHJ1Z1xcdTAxMDNtIHNcXHUwMTAzIGNvbXBsZXRhXFx1MDIxYmkgdG9hdGUgY1xcdTAwZTJtcHVyaWxlLlxcXCIpO1xcclxcbiAgICAgICAgICAgICAgICByZXR1cm47XFxyXFxuICAgICAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodE1ldGVycyA9IGhlaWdodCBcXC8gMTAwO1xcclxcbiAgICAgICAgICAgIGNvbnN0IGJtaSA9ICh3ZWlnaHQgXFwvIChoZWlnaHRNZXRlcnMgKiBoZWlnaHRNZXRlcnMpKS50b0ZpeGVkKDIpO1xcclxcblxcclxcbiAgICAgICAgICAgIGxldCBsZXZlbDtcXHJcXG4gICAgICAgICAgICBpZiAoYm1pIDwgMTguNSkge1xcclxcbiAgICAgICAgICAgICAgICBsZXZlbCA9ICdTdWJwb25kZXJhbGknO1xcclxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm1pID49IDE4LjUgJiYgYm1pIDwgMjUpIHtcXHJcXG4gICAgICAgICAgICAgICAgbGV2ZWwgPSAnU3RhbmRhcmQnO1xcclxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm1pID49IDI1ICYmIGJtaSA8IDMwKSB7XFxyXFxuICAgICAgICAgICAgICAgIGxldmVsID0gJ0V4Y2VzdWwgZGUgZ3JldXRhdGUnO1xcclxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAgICAgICAgIGxldmVsID0gJ0dyXFx1MDEwM3NpbWUnO1xcclxcbiAgICAgICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgICAgICBjb25zdCBoZWFsdGh5Qm1pTWluID0gMTguNTtcXHJcXG4gICAgICAgICAgICBjb25zdCBoZWFsdGh5Qm1pTWF4ID0gMjQuOTtcXHJcXG4gICAgICAgICAgICBjb25zdCBoZWFsdGh5V2VpZ2h0TWluID0gKGhlYWx0aHlCbWlNaW4gKiBoZWlnaHRNZXRlcnMgKiBoZWlnaHRNZXRlcnMpLnRvRml4ZWQoMSk7XFxyXFxuICAgICAgICAgICAgY29uc3QgaGVhbHRoeVdlaWdodE1heCA9IChoZWFsdGh5Qm1pTWF4ICogaGVpZ2h0TWV0ZXJzICogaGVpZ2h0TWV0ZXJzKS50b0ZpeGVkKDEpO1xcclxcblxcclxcbiAgICAgICAgICAgIGxldCByZWNvbW1lbmRhdGlvbiA9ICcnO1xcclxcbiAgICAgICAgICAgIGlmICh3ZWlnaHQgPCBoZWFsdGh5V2VpZ2h0TWluKSB7XFxyXFxuICAgICAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uID0gYFRyZWJ1aWUgc1xcdTAxMDMgY1xcdTAwZTJcXHUwMjE5dGlnaSAkeyhoZWFsdGh5V2VpZ2h0TWluIC0gd2VpZ2h0KS50b0ZpeGVkKDEpfSBrZyBwZW50cnUgYSBhdGluZ2Ugbm9ybWEuYDtcXHJcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdlaWdodCA+IGhlYWx0aHlXZWlnaHRNYXgpIHtcXHJcXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb24gPVxcclxcbiAgICAgICAgICAgICAgICAgICAgYFRyZWJ1aWUgc1xcdTAxMDMgc2xcXHUwMTAzYmVcXHUwMjE5dGkgJHsod2VpZ2h0IC0gaGVhbHRoeVdlaWdodE1heCkudG9GaXhlZCgxKX0ga2cgcGVudHJ1IGEgYXRpbmdlIG5vcm1hLmA7XFxyXFxuICAgICAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb24gPSAnR3JldXRhdGVhIGR2cy4gZXN0ZSBcXHUwMGVlbiBsaW1pdGVsZSBub3JtYWxlLic7XFxyXFxuICAgICAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdibWktcmVzdWx0JykudGV4dENvbnRlbnQgPSBibWk7XFxyXFxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JtaS1sZXZlbCcpLnRleHRDb250ZW50ID0gbGV2ZWw7XFxyXFxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aHktYm1pJykudGV4dENvbnRlbnQgPSBgJHtoZWFsdGh5Qm1pTWlufSAtICR7aGVhbHRoeUJtaU1heH1gO1xcclxcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGh5LXdlaWdodCcpLnRleHRDb250ZW50ID0gYCR7aGVhbHRoeVdlaWdodE1pbn0ga2cgLSAke2hlYWx0aHlXZWlnaHRNYXh9IGtnYDtcXHJcXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjb21tZW5kYXRpb24nKS50ZXh0Q29udGVudCA9IHJlY29tbWVuZGF0aW9uO1xcclxcbiAgICAgICAgfVxcclxcbiAgICA8XFwvc2NyaXB0PlwifSxcIm5hbWVcIjpcImZpZWxkNDkzNzZcIixcInBhcnRUeXBlXCI6XCJodG1sXCIsXCJoQWxpZ25cIjpcIlwiLFwibWFyZ2luVG9wXCI6XCJcIixcIm1hcmdpbkJvdHRvbVwiOlwiXCIsXCJ0ZXh0Q29sb3JcIjpcIlwiLFwibGluZUhlaWdodFwiOlwiXCIsXCJlbGVtZW50Q3NzQ2xhc3NcIjpcIlwifX19LFwiaGFuZGxlclwiOlwiXCIsXCJmb3JtQm94XCI6e1wiYmdjb2xvclwiOlwiI0YwRjBGMFwiLFwiY29sb3JcIjpcIlwiLFwiYmdpbWFnZVwiOntcImhhc2hcIjpcIlwifSxcImJvcmRlclwiOntcIndpZHRoXCI6XCIwcHhcIixcInR5cGVcIjpcInNvbGlkXCIsXCJjb2xvclwiOlwiIzk5OTk5OVwiLFwicmFkaXVzXCI6XCJcIn0sXCJwYWRkaW5nc1wiOntcImhvcml6b250YWxcIjpcIjQwcHhcIixcInZlcnRpY2FsXCI6XCIzMHB4XCJ9LFwiZmxleERpcmVjdGlvblwiOlwiY29sdW1uXCIsXCJ0ZXh0QWxpZ25cIjpcIlwifX0sXCJibG9ja0NvZGVcIjpcIjczOWVlXCIsXCJ2aWV3QmxvY2tMZWZ0T2Zmc2V0XCI6XCIyXCIsXCJ2aWV3QmxvY2tXaWR0aFwiOlwiOFwiLFwiYmxvY2tQYWRkaW5nVG9wXCI6XCIyLjVcIixcImJsb2NrUGFkZGluZ0JvdHRvbVwiOlwiMi41XCIsXCJibG9ja0JhY2tncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0ZvcmVncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0xpbmtDb2xvclwiOlwiXCIsXCJibG9ja0ZvbnRcIjpcIlwiLFwiYmxvY2tGb250SGVhZGVyXCI6XCJcIixcImJsb2NrQ3NzQ2xhc3NcIjpcIlwiLFwiYmxvY2tDb3ZlclwiOntcImltYWdlXCI6e1wiaGFzaFwiOlwiXCJ9LFwiYmFja2dyb3VuZFR5cGVcIjpcInNjcm9sbFwiLFwiaGVpZ2h0XCI6XCIxMDB2aFwiLFwidmlkZW9cIjp7XCJzcmNfdmlkZW9fbGlua1wiOlwiXCIsXCJhdXRvcGxheVwiOlwiMFwiLFwidmltZW9faGFzaFwiOlwiXCJ9LFwiYmFja2dyb3VuZE9wYWNpdHlTdGFydFwiOlwiMC4zXCIsXCJiYWNrZ3JvdW5kT3BhY2l0eUZpbmlzaFwiOlwiMC42XCJ9LFwiYm94XCI6e1wiYmdjb2xvclwiOlwiI0YwRjBGMFwiLFwiY29sb3JcIjpcIlwiLFwiYmdpbWFnZVwiOntcImhhc2hcIjpcIlwifSxcImJvcmRlclwiOntcIndpZHRoXCI6XCIwcHhcIixcInR5cGVcIjpcInNvbGlkXCIsXCJjb2xvclwiOlwiIzk5OTk5OVwiLFwicmFkaXVzXCI6XCJcIn0sXCJwYWRkaW5nc1wiOntcImhvcml6b250YWxcIjpcIjQwcHhcIixcInZlcnRpY2FsXCI6XCIzMHB4XCJ9fSxcImlzTW9kYWxcIjp7XCJwb3B1cFR5cGVcIjpcInBvcHVwXCIsXCJtb2RhbFdpZHRoXCI6XCJcIixcIm1vZGFsQ2xhc3NcIjpcIlwifSxcImJsb2NrQ2xpY2tBY3Rpb25cIjp7XCJ0eXBlXCI6XCJcIixcImxpbmtcIjpcIlwiLFwiamF2YXNjcmlwdFwiOlwiXCIsXCJmb3JtVHlwZVwiOlwic3Vic2NyaWJlXCIsXCJwb3NpdGlvblwiOntcIm9mZmVyX2lkXCI6XCJcIn0sXCJmb3JtVGl0bGVcIjpcIlwiLFwiZm9ybUJ1dHRvblRpdGxlXCI6XCJcIixcImZvcm1CbG9ja0NvZGVcIjpcIlwiLFwibW9kYWxCbG9ja0NvZGVcIjpcIlwifSxcImJsb2NrRmxleFwiOntcImJhc2lzXCI6XCJcIixcInNocmlua1wiOlwiXCIsXCJncm93XCI6XCJcIn19IiwiY3NzIjpudWxsfQ==

HTML

    <style>
        .confirm-rules-checkbox {
            display: none;
        }

        .bmi-container {
            display: flex;
            flex-direction: row;
            background-color: #fff;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
            max-width: 800px;
            width: 100%;
        }

        .input-section,
        .result-section {
            flex: 1;
            padding: 20px;
        }

        .input-section {
            border-right: 1px solid #ddd;
        }

        label {
            display: block;
            margin-bottom: 10px;
            font-weight: bold;
        }

        input,
        select {
            width: 90%;
            padding: 10px;
            margin-bottom: 15px;
            border: 1px solid #ddd;
            border-radius: 5px;
            font-size: 16px;
        }

        .bmi-container h2 {
            margin-bottom: 20px;
            font-size: 30px;
        }

        .result-section p {
            margin-bottom: 10px;
        }

        .calculate-btn {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 90%;
            padding: 10px;
            background-color: #007BFF;
            color: #fff;
            border: none;
            border-radius: 5px;
            font-size: 16px;
            cursor: pointer;
        }

        .calculate-btn:hover {
            background-color: #0056b3;
        }

        .result-section span {
            font-weight: bold;
        }
    </style>

    <div class="bmi-container">
        <div class="input-section">
            <h2>Introdu datele</h2>
            <label for="age">Vârsta (ani):</label>
            <input type="number" id="age" min="1" max="120" placeholder="">

            <label for="gender">Sex:</label>
            <select id="gender">
                <option value="male">Bărbat</option>
                <option value="female">Femeie</option>
            </select>

            <label for="height">Înălțime (cm):</label>
            <input type="number" id="height" min="50" max="250" placeholder="">

            <label for="weight">Greutate (kg):</label>
            <input type="number" id="weight" min="20" max="300" placeholder="">

            <div class="calculate-btn" onclick="calculateBMI()">Calculează IMC</div>
        </div>

        <div class="result-section">
            <h2>Rezultat</h2>
            <p>IMC-ul tău:<span id="bmi-result">--</span></p>
            <p>Nivel: <span id="bmi-level">--</span></p>
            <p>Diapazonul sănătos: <span id="healthy-bmi">--</span></p>
            <p>Greutate optimă:<span id="healthy-weight">--</span></p>
            <p>Recomandări:<span id="recommendation">--</span></p>
        </div>
    </div>

    <script>
        function calculateBMI() {
            const age = parseInt(document.getElementById('age').value, 10);
            const gender = document.getElementById('gender').value;
            const height = parseFloat(document.getElementById('height').value);
            const weight = parseFloat(document.getElementById('weight').value);

            if (isNaN(age) || isNaN(height) || isNaN(weight)) {
                alert("Vă rugăm să completați toate câmpurile.");
                return;
            }

            const heightMeters = height / 100;
            const bmi = (weight / (heightMeters * heightMeters)).toFixed(2);

            let level;
            if (bmi < 18.5) {
                level = 'Subponderali';
            } else if (bmi >= 18.5 && bmi < 25) {
                level = 'Standard';
            } else if (bmi >= 25 && bmi < 30) {
                level = 'Excesul de greutate';
            } else {
                level = 'Grăsime';
            }

            const healthyBmiMin = 18.5;
            const healthyBmiMax = 24.9;
            const healthyWeightMin = (healthyBmiMin * heightMeters * heightMeters).toFixed(1);
            const healthyWeightMax = (healthyBmiMax * heightMeters * heightMeters).toFixed(1);

            let recommendation = '';
            if (weight < healthyWeightMin) {
                recommendation = `Trebuie să câștigi ${(healthyWeightMin - weight).toFixed(1)} kg pentru a atinge norma.`;
            } else if (weight > healthyWeightMax) {
                recommendation =
                    `Trebuie să slăbești ${(weight - healthyWeightMax).toFixed(1)} kg pentru a atinge norma.`;
            } else {
                recommendation = 'Greutatea dvs. este în limitele normale.';
            }

            document.getElementById('bmi-result').textContent = bmi;
            document.getElementById('bmi-level').textContent = level;
            document.getElementById('healthy-bmi').textContent = `${healthyBmiMin} - ${healthyBmiMax}`;
            document.getElementById('healthy-weight').textContent = `${healthyWeightMin} kg - ${healthyWeightMax} kg`;
            document.getElementById('recommendation').textContent = recommendation;
        }
    </script>

GetFusion

https://getfusion.ru/docs

 

Body Fat Calculator

image.png

Экспорт блока

eyJ0eXBlIjoicmF3LWh0bWwiLCJwcmVzZXQiOiJyYXctaHRtbCIsInBhcmFtcyI6IntcImJsb2NrQ29kZVwiOlwiYzRhNjRcIixcIm5hbWVcIjpcIlwiLFwicmF3VmFsdWVcIjpcIjxzdHlsZT5cXG4gICAgXFwvKiBib2R5IHtcXG4gICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmNTtcXG4gICAgICAgICAgICBtYXJnaW46IDA7XFxuICAgICAgICAgICAgcGFkZGluZzogMDtcXG4gICAgICAgIH0gKlxcL1xcblxcbiAgICAubW5mc3QtYmZjIHtcXG4gICAgICAgIG1heC13aWR0aDogNTAwcHg7XFxuICAgICAgICBtYXJnaW46IDUwcHggYXV0bztcXG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICB9XFxuXFxuICAgIC5tbmZzdC1iZmMgaDEge1xcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgICAgY29sb3I6ICMzMzM7XFxuICAgIH1cXG5cXG4gICAgLm1uZnN0LWJmYyBsYWJlbCB7XFxuICAgICAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgIGNvbG9yOiAjNTU1O1xcbiAgICB9XFxuXFxuICAgIC5tbmZzdC1iZmMgaW5wdXQsXFxuICAgIC5tbmZzdC1iZmMgc2VsZWN0IHtcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgICAgcGFkZGluZzogMTBweDtcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XFxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xcbiAgICB9XFxuXFxuICAgIC5tbmZzdC1iZmMgYnV0dG9uIHtcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgICAgcGFkZGluZzogMTJweDtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyOGE3NDU7XFxuICAgICAgICBjb2xvcjogd2hpdGU7XFxuICAgICAgICBib3JkZXI6IG5vbmU7XFxuICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIH1cXG5cXG4gICAgLm1uZnN0LWJmYyBidXR0b246aG92ZXIge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzIxODgzODtcXG4gICAgfVxcblxcbiAgICAubW5mc3QtYmZjIC5yZXN1bHRzIHtcXG4gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7XFxuICAgIH1cXG5cXG4gICAgLm1uZnN0LWJmYyAucmVzdWx0LWl0ZW0ge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgfVxcblxcbiAgICAubW5mc3QtYmZjIC5yZXN1bHQtbGFiZWwge1xcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgICAgICBjb2xvcjogIzMzMztcXG4gICAgfVxcbjxcXC9zdHlsZT5cXG5cXG48ZGl2IGNsYXNzPVxcXCJtbmZzdC1iZmNcXFwiPlxcbiAgICA8aDE+Qm9keSBGYXQgQ2FsY3VsYXRvcjxcXC9oMT5cXG5cXG4gICAgPGxhYmVsIGZvcj1cXFwiZ2VuZGVyXFxcIj5TZXg6PFxcL2xhYmVsPlxcbiAgICA8c2VsZWN0IGlkPVxcXCJnZW5kZXJcXFwiIG9uY2hhbmdlPVxcXCJ0b2dnbGVIaXBGaWVsZCgpXFxcIj5cXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XFxcIm1hbGVcXFwiPmJcXHUwMTAzcmJhdDxcXC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uIHZhbHVlPVxcXCJmZW1hbGVcXFwiPmZlbWVpZTxcXC9vcHRpb24+XFxuICAgIDxcXC9zZWxlY3Q+XFxuXFxuICAgIDxsYWJlbCBmb3I9XFxcImFnZVxcXCI+VlxcdTAwZTJyc3RhOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcImFnZVxcXCIgcGxhY2Vob2xkZXI9XFxcImludHJvZHUgdlxcdTAwZTJyc3RhXFxcIiByZXF1aXJlZD5cXG5cXG4gICAgPGxhYmVsIGZvcj1cXFwid2VpZ2h0XFxcIj5HcmV1dGF0ZSAoa2cpOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIndlaWdodFxcXCIgcGxhY2Vob2xkZXI9XFxcImludHJvZHUgZ3JldXRhdGVhXFxcIiByZXF1aXJlZD5cXG5cXG4gICAgPGxhYmVsIGZvcj1cXFwiaGVpZ2h0XFxcIj5cXHUwMGNlblxcdTAxMDNsXFx1MDIxYmltZWEgKGNtKTo8XFwvbGFiZWw+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJudW1iZXJcXFwiIGlkPVxcXCJoZWlnaHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJpbnRyb2R1IFxcdTAwZWVuXFx1MDEwM2xcXHUwMjFiaW1lYVxcXCIgcmVxdWlyZWQ+XFxuXFxuICAgIDxsYWJlbCBmb3I9XFxcIm5lY2tcXFwiPkdcXHUwMGUydCAoY20pOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIm5lY2tcXFwiIHBsYWNlaG9sZGVyPVxcXCJpbnRyb2R1IGNpcmN1bWZlcmluXFx1MDIxYmEgZ1xcdTAwZTJ0dWx1aVxcXCIgcmVxdWlyZWQ+XFxuXFxuICAgIDxsYWJlbCBmb3I9XFxcIndhaXN0XFxcIj5UYWxpZSAoY20pOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIndhaXN0XFxcIiBwbGFjZWhvbGRlcj1cXFwiaW50cm9kdSBjaXJjdW1mZXJpblxcdTAyMWJhIHRhbGllaVxcXCIgcmVxdWlyZWQ+XFxuXFxuICAgIDxkaXYgaWQ9XFxcImhpcEZpZWxkXFxcIiBzdHlsZT1cXFwiZGlzcGxheTpub25lO1xcXCI+XFxuICAgICAgICA8bGFiZWwgZm9yPVxcXCJoaXBcXFwiPlxcdTAyMThvbGR1cmkgKGNtKTo8XFwvbGFiZWw+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwibnVtYmVyXFxcIiBpZD1cXFwiaGlwXFxcIiBwbGFjZWhvbGRlcj1cXFwiaW50cm9kdSBjaXJjdW1mZXJpblxcdTAyMWJhIFxcdTAyMTlvbGR1cmlsb3JcXFwiPlxcbiAgICA8XFwvZGl2PlxcblxcbiAgICA8YnV0dG9uIG9uY2xpY2s9XFxcImNhbGN1bGF0ZUJvZHlGYXQoKVxcXCI+Q2FsY3VsZWF6XFx1MDEwMzxcXC9idXR0b24+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdHNcXFwiIGlkPVxcXCJyZXN1bHRzXFxcIj48XFwvZGl2PlxcbjxcXC9kaXY+XFxuXFxuPHNjcmlwdD5cXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGlwRmllbGQoKSB7XFxuICAgICAgICBjb25zdCBnZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZGVyJykudmFsdWU7XFxuICAgICAgICBjb25zdCBoaXBGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXBGaWVsZCcpO1xcbiAgICAgICAgaWYgKGdlbmRlciA9PT0gJ2ZlbWFsZScpIHtcXG4gICAgICAgICAgICBoaXBGaWVsZC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaGlwRmllbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVCb2R5RmF0KCkge1xcbiAgICAgICAgY29uc3QgZ2VuZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlbmRlcicpLnZhbHVlO1xcbiAgICAgICAgY29uc3QgYWdlID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlJykudmFsdWUpO1xcbiAgICAgICAgY29uc3Qgd2VpZ2h0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VpZ2h0JykudmFsdWUpO1xcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVpZ2h0JykudmFsdWUpO1xcbiAgICAgICAgY29uc3QgbmVjayA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lY2snKS52YWx1ZSk7XFxuICAgICAgICBjb25zdCB3YWlzdCA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dhaXN0JykudmFsdWUpO1xcbiAgICAgICAgbGV0IGhpcCA9IG51bGw7XFxuXFxuICAgICAgICBpZiAoZ2VuZGVyID09PSAnZmVtYWxlJykge1xcbiAgICAgICAgICAgIGhpcCA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpcCcpLnZhbHVlKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIFxcL1xcLyBVLlMuIE5hdnkgTWV0aG9kIENhbGN1bGF0aW9uXFxuICAgICAgICBsZXQgYm9keUZhdFBlcmNlbnRhZ2U7XFxuICAgICAgICBpZiAoZ2VuZGVyID09PSAnbWFsZScpIHtcXG4gICAgICAgICAgICBib2R5RmF0UGVyY2VudGFnZSA9IDQ5NSBcXC8gKDEuMDMyNCAtIDAuMTkwNzcgKiBNYXRoLmxvZzEwKHdhaXN0IC0gbmVjaykgKyAwLjE1NDU2ICogTWF0aC5sb2cxMChoZWlnaHQpKSAtXFxuICAgICAgICAgICAgICAgIDQ1MDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgYm9keUZhdFBlcmNlbnRhZ2UgPSA0OTUgXFwvICgxLjI5NTc5IC0gMC4zNTAwNCAqIE1hdGgubG9nMTAod2Fpc3QgKyBoaXAgLSBuZWNrKSArIDAuMjIxMDAgKiBNYXRoLmxvZzEwKFxcbiAgICAgICAgICAgICAgICBoZWlnaHQpKSAtIDQ1MDtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGNvbnN0IGJvZHlGYXRNYXNzID0gKGJvZHlGYXRQZXJjZW50YWdlIFxcLyAxMDApICogd2VpZ2h0O1xcbiAgICAgICAgY29uc3QgbGVhbkJvZHlNYXNzID0gd2VpZ2h0IC0gYm9keUZhdE1hc3M7XFxuXFxuICAgICAgICBcXC9cXC8gSmFja3NvbiAmIFBvbGxvY2sgSWRlYWwgQm9keSBGYXQgQ2FsY3VsYXRpb25cXG4gICAgICAgIGxldCBpZGVhbEJvZHlGYXQgPSBpZGVhbEJvZHlGYXRDYWxjKGFnZSwgZ2VuZGVyKTtcXG5cXG4gICAgICAgIGNvbnN0IGJvZHlGYXRUb0xvc2UgPSBNYXRoLm1heCgwLCBib2R5RmF0TWFzcyAtIChpZGVhbEJvZHlGYXQgXFwvIDEwMCkgKiB3ZWlnaHQpO1xcblxcbiAgICAgICAgXFwvXFwvIEJNSSBNZXRob2QgZm9yIEJvZHkgRmF0IChhcHByb3hpbWF0aW9uKVxcbiAgICAgICAgY29uc3QgYm1pID0gd2VpZ2h0IFxcLyBNYXRoLnBvdyhoZWlnaHQgXFwvIDEwMCwgMik7XFxuICAgICAgICBjb25zdCBib2R5RmF0Qm1pTWV0aG9kID0gKDEuMiAqIGJtaSkgKyAoMC4yMyAqIGFnZSkgLSAoMTAuOCAqIChnZW5kZXIgPT09ICdtYWxlJyA/IDEgOiAwKSkgLSA1LjQ7XFxuXFxuICAgICAgICBcXC9cXC8gQm9keSBGYXQgQ2F0ZWdvcnlcXG4gICAgICAgIGxldCBib2R5RmF0Q2F0ZWdvcnk7XFxuICAgICAgICBpZiAoZ2VuZGVyID09PSAnbWFsZScpIHtcXG4gICAgICAgICAgICBpZiAoYm9keUZhdFBlcmNlbnRhZ2UgPCA2KSB7XFxuICAgICAgICAgICAgICAgIGJvZHlGYXRDYXRlZ29yeSA9ICdFc3NlbnRpYWwgZmF0JztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMTQpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0F0aGxldGVzJztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMTgpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0ZpdG5lc3MnO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keUZhdFBlcmNlbnRhZ2UgPCAyNSkge1xcbiAgICAgICAgICAgICAgICBib2R5RmF0Q2F0ZWdvcnkgPSAnQXZlcmFnZSc7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ09iZXNlJztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChib2R5RmF0UGVyY2VudGFnZSA8IDE0KSB7XFxuICAgICAgICAgICAgICAgIGJvZHlGYXRDYXRlZ29yeSA9ICdFc3NlbnRpYWwgZmF0JztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMjEpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0F0aGxldGVzJztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMjUpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0ZpdG5lc3MnO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keUZhdFBlcmNlbnRhZ2UgPCAzMikge1xcbiAgICAgICAgICAgICAgICBib2R5RmF0Q2F0ZWdvcnkgPSAnQXZlcmFnZSc7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ09iZXNlJztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICBcXC9cXC8gRGlzcGxheSByZXN1bHRzXFxuICAgICAgICBjb25zdCByZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMnKTtcXG4gICAgICAgIHJlc3VsdHMuaW5uZXJIVE1MID0gYFxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1pdGVtXFxcIj48c3BhbiBjbGFzcz1cXFwicmVzdWx0LWxhYmVsXFxcIj5Cb2R5IEZhdCAoJSk6PFxcL3NwYW4+ICR7Ym9keUZhdFBlcmNlbnRhZ2UudG9GaXhlZCgyKX0lPFxcL2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaXRlbVxcXCI+PHNwYW4gY2xhc3M9XFxcInJlc3VsdC1sYWJlbFxcXCI+Qm9keSBGYXQgQ2F0ZWdvcnk6PFxcL3NwYW4+ICR7Ym9keUZhdENhdGVnb3J5fTxcXC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWl0ZW1cXFwiPjxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtbGFiZWxcXFwiPkJvZHkgRmF0IE1hc3MgKGtnKTo8XFwvc3Bhbj4gJHtib2R5RmF0TWFzcy50b0ZpeGVkKDIpfSBrZzxcXC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWl0ZW1cXFwiPjxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtbGFiZWxcXFwiPkxlYW4gQm9keSBNYXNzIChrZyk6PFxcL3NwYW4+ICR7bGVhbkJvZHlNYXNzLnRvRml4ZWQoMil9IGtnPFxcL2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaXRlbVxcXCI+PHNwYW4gY2xhc3M9XFxcInJlc3VsdC1sYWJlbFxcXCI+SWRlYWwgQm9keSBGYXQgZm9yIEdpdmVuIEFnZSAoJSk6PFxcL3NwYW4+ICR7aWRlYWxCb2R5RmF0LnRvRml4ZWQoMil9JTxcXC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWl0ZW1cXFwiPjxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtbGFiZWxcXFwiPkJvZHkgRmF0IHRvIExvc2UgdG8gUmVhY2ggSWRlYWwgKGtnKTo8XFwvc3Bhbj4gJHtib2R5RmF0VG9Mb3NlLnRvRml4ZWQoMil9IGtnPFxcL2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaXRlbVxcXCI+PHNwYW4gY2xhc3M9XFxcInJlc3VsdC1sYWJlbFxcXCI+Qm9keSBGYXQgKCUpOjxcXC9zcGFuPiAoQk1JIG1ldGhvZCk6ICR7Ym9keUZhdEJtaU1ldGhvZC50b0ZpeGVkKDIpfSU8XFwvZGl2PlxcbiAgICAgICAgYDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBpZGVhbEJvZHlGYXRDYWxjKGFnZSwgZ2VuZGVyKSB7XFxuICAgICAgICBpZiAoZ2VuZGVyID09PSBcXFwibWFsZVxcXCIpIHtcXG4gICAgICAgICAgICBpZiAoYWdlIDw9IDIwKSByZXR1cm4gOC41O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSAyNSkgcmV0dXJuIDEwLjU7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDMwKSByZXR1cm4gMTIuNztcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gMzUpIHJldHVybiAxMy43O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSA0MCkgcmV0dXJuIDE1LjM7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDQ1KSByZXR1cm4gMTYuNDtcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gNTApIHJldHVybiAxOC45O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSA1NSkgcmV0dXJuIDIwLjk7XFxuICAgICAgICAgICAgZWxzZSByZXR1cm4gMjI7IFxcL1xcLyBcXHUwNDFjXFx1MDQzZVxcdTA0MzZcXHUwNDNkXFx1MDQzZSBcXHUwNDQzXFx1MDQzYVxcdTA0MzBcXHUwNDM3XFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMyXFx1MDQzZVxcdTA0MzdcXHUwNDQwXFx1MDQzMFxcdTA0NDFcXHUwNDQyXFx1MDQzMCBcXHUwNDMyXFx1MDQ0YlxcdTA0NDhcXHUwNDM1IDU1XFxuICAgICAgICB9IGVsc2UgaWYgKGdlbmRlciA9PT0gXFxcImZlbWFsZVxcXCIpIHtcXG4gICAgICAgICAgICBpZiAoYWdlIDw9IDIwKSByZXR1cm4gMTcuNztcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gMjUpIHJldHVybiAxOC40O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSAzMCkgcmV0dXJuIDE5LjM7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDM1KSByZXR1cm4gMjEuNTtcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gNDApIHJldHVybiAyMi4yO1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSA0NSkgcmV0dXJuIDIyLjk7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDUwKSByZXR1cm4gMjUuMjtcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gNTUpIHJldHVybiAyNi4zO1xcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIDI4OyBcXC9cXC8gXFx1MDQxY1xcdTA0M2VcXHUwNDM2XFx1MDQzZFxcdTA0M2UgXFx1MDQ0M1xcdTA0M2FcXHUwNDMwXFx1MDQzN1xcdTA0MzBcXHUwNDQyXFx1MDQ0YyBcXHUwNDM3XFx1MDQzZFxcdTA0MzBcXHUwNDQ3XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQzNSBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQzMlxcdTA0M2VcXHUwNDM3XFx1MDQ0MFxcdTA0MzBcXHUwNDQxXFx1MDQ0MlxcdTA0MzAgXFx1MDQzMlxcdTA0NGJcXHUwNDQ4XFx1MDQzNSA1NVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIG51bGw7IFxcL1xcLyBcXHUwNDE1XFx1MDQ0MVxcdTA0M2JcXHUwNDM4IFxcdTA0M2ZcXHUwNDNlXFx1MDQzYiBcXHUwNDNkXFx1MDQzNSBcXHUwNDQzXFx1MDQzYVxcdTA0MzBcXHUwNDM3XFx1MDQzMFxcdTA0M2QsIFxcdTA0MzJcXHUwNDNlXFx1MDQzN1xcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDMwXFx1MDQzNVxcdTA0M2MgbnVsbFxcbiAgICB9XFxuPFxcL3NjcmlwdD5cIixcInJlcGxhY2VWYXJpYWJsZXNcIjpcIlwiLFwiYmxvY2tQYWRkaW5nVG9wXCI6MCxcImJsb2NrUGFkZGluZ0JvdHRvbVwiOjAsXCJibG9ja0JhY2tncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0ZvcmVncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0xpbmtDb2xvclwiOlwiXCIsXCJibG9ja0ZvbnRcIjpudWxsLFwiYmxvY2tGb250SGVhZGVyXCI6bnVsbCxcImJsb2NrQ3NzQ2xhc3NcIjpcIlwiLFwiYmxvY2tDb3ZlclwiOm51bGwsXCJpc01vZGFsXCI6bnVsbCxcImJsb2NrQ2xpY2tBY3Rpb25cIjpcIlwiLFwiYmxvY2tGbGV4XCI6MH0iLCJjc3MiOm51bGwsImlzUmVkZXNpZ24iOmZhbHNlfQ==
<style>
    /* body {
            font-family: Arial, sans-serif;
            background-color: #f0f0f5;
            margin: 0;
            padding: 0;
        } */

    .mnfst-bfc {
        max-width: 500px;
        margin: 50px auto;
        padding: 20px;
        background-color: white;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        border-radius: 10px;
    }

    .mnfst-bfc h1 {
        text-align: center;
        color: #333;
    }

    .mnfst-bfc label {
        display: block;
        margin-bottom: 8px;
        color: #555;
    }

    .mnfst-bfc input,
    .mnfst-bfc select {
        width: 100%;
        padding: 10px;
        margin-bottom: 15px;
        border: 1px solid #ccc;
        border-radius: 5px;
    }

    .mnfst-bfc button {
        width: 100%;
        padding: 12px;
        background-color: #28a745;
        color: white;
        border: none;
        border-radius: 5px;
        cursor: pointer;
    }

    .mnfst-bfc button:hover {
        background-color: #218838;
    }

    .mnfst-bfc .results {
        margin-top: 20px;
    }

    .mnfst-bfc .result-item {
        margin-bottom: 10px;
    }

    .mnfst-bfc .result-label {
        font-weight: bold;
        color: #333;
    }
</style>

<div class="mnfst-bfc">
    <h1>Body Fat Calculator</h1>

    <label for="gender">Sex:</label>
    <select id="gender" onchange="toggleHipField()">
        <option value="male">bărbat</option>
        <option value="female">femeie</option>
    </select>

    <label for="age">Vârsta:</label>
    <input type="number" id="age" placeholder="introdu vârsta" required>

    <label for="weight">Greutate (kg):</label>
    <input type="number" id="weight" placeholder="introdu greutatea" required>

    <label for="height">Înălțimea (cm):</label>
    <input type="number" id="height" placeholder="introdu înălțimea" required>

    <label for="neck">Gât (cm):</label>
    <input type="number" id="neck" placeholder="introdu circumferința gâtului" required>

    <label for="waist">Talie (cm):</label>
    <input type="number" id="waist" placeholder="introdu circumferința taliei" required>

    <div id="hipField" style="display:none;">
        <label for="hip">Șolduri (cm):</label>
        <input type="number" id="hip" placeholder="introdu circumferința șoldurilor">
    </div>

    <button onclick="calculateBodyFat()">Calculează</button>

    <div class="results" id="results"></div>
</div>

<script>
    function toggleHipField() {
        const gender = document.getElementById('gender').value;
        const hipField = document.getElementById('hipField');
        if (gender === 'female') {
            hipField.style.display = 'block';
        } else {
            hipField.style.display = 'none';
        }
    }

    function calculateBodyFat() {
        const gender = document.getElementById('gender').value;
        const age = parseFloat(document.getElementById('age').value);
        const weight = parseFloat(document.getElementById('weight').value);
        const height = parseFloat(document.getElementById('height').value);
        const neck = parseFloat(document.getElementById('neck').value);
        const waist = parseFloat(document.getElementById('waist').value);
        let hip = null;

        if (gender === 'female') {
            hip = parseFloat(document.getElementById('hip').value);
        }

        // U.S. Navy Method Calculation
        let bodyFatPercentage;
        if (gender === 'male') {
            bodyFatPercentage = 495 / (1.0324 - 0.19077 * Math.log10(waist - neck) + 0.15456 * Math.log10(height)) -
                450;
        } else {
            bodyFatPercentage = 495 / (1.29579 - 0.35004 * Math.log10(waist + hip - neck) + 0.22100 * Math.log10(
                height)) - 450;
        }

        const bodyFatMass = (bodyFatPercentage / 100) * weight;
        const leanBodyMass = weight - bodyFatMass;

        // Jackson & Pollock Ideal Body Fat Calculation
        let idealBodyFat = idealBodyFatCalc(age, gender);

        const bodyFatToLose = Math.max(0, bodyFatMass - (idealBodyFat / 100) * weight);

        // BMI Method for Body Fat (approximation)
        const bmi = weight / Math.pow(height / 100, 2);
        const bodyFatBmiMethod = (1.2 * bmi) + (0.23 * age) - (10.8 * (gender === 'male' ? 1 : 0)) - 5.4;

        // Body Fat Category
        let bodyFatCategory;
        if (gender === 'male') {
            if (bodyFatPercentage < 6) {
                bodyFatCategory = 'Essential fat';
            } else if (bodyFatPercentage < 14) {
                bodyFatCategory = 'Athletes';
            } else if (bodyFatPercentage < 18) {
                bodyFatCategory = 'Fitness';
            } else if (bodyFatPercentage < 25) {
                bodyFatCategory = 'Average';
            } else {
                bodyFatCategory = 'Obese';
            }
        } else {
            if (bodyFatPercentage < 14) {
                bodyFatCategory = 'Essential fat';
            } else if (bodyFatPercentage < 21) {
                bodyFatCategory = 'Athletes';
            } else if (bodyFatPercentage < 25) {
                bodyFatCategory = 'Fitness';
            } else if (bodyFatPercentage < 32) {
                bodyFatCategory = 'Average';
            } else {
                bodyFatCategory = 'Obese';
            }
        }

        // Display results
        const results = document.getElementById('results');
        results.innerHTML = `
            <div class="result-item"><span class="result-label">Body Fat (%):</span> ${bodyFatPercentage.toFixed(2)}%</div>
            <div class="result-item"><span class="result-label">Body Fat Category:</span> ${bodyFatCategory}</div>
            <div class="result-item"><span class="result-label">Body Fat Mass (kg):</span> ${bodyFatMass.toFixed(2)} kg</div>
            <div class="result-item"><span class="result-label">Lean Body Mass (kg):</span> ${leanBodyMass.toFixed(2)} kg</div>
            <div class="result-item"><span class="result-label">Ideal Body Fat for Given Age (%):</span> ${idealBodyFat.toFixed(2)}%</div>
            <div class="result-item"><span class="result-label">Body Fat to Lose to Reach Ideal (kg):</span> ${bodyFatToLose.toFixed(2)} kg</div>
            <div class="result-item"><span class="result-label">Body Fat (%):</span> (BMI method): ${bodyFatBmiMethod.toFixed(2)}%</div>
        `;
    }

    function idealBodyFatCalc(age, gender) {
        if (gender === "male") {
            if (age <= 20) return 8.5;
            else if (age <= 25) return 10.5;
            else if (age <= 30) return 12.7;
            else if (age <= 35) return 13.7;
            else if (age <= 40) return 15.3;
            else if (age <= 45) return 16.4;
            else if (age <= 50) return 18.9;
            else if (age <= 55) return 20.9;
            else return 22; // Можно указать значение для возраста выше 55
        } else if (gender === "female") {
            if (age <= 20) return 17.7;
            else if (age <= 25) return 18.4;
            else if (age <= 30) return 19.3;
            else if (age <= 35) return 21.5;
            else if (age <= 40) return 22.2;
            else if (age <= 45) return 22.9;
            else if (age <= 50) return 25.2;
            else if (age <= 55) return 26.3;
            else return 28; // Можно указать значение для возраста выше 55
        }
        return null; // Если пол не указан, возвращаем null
    }
</script>

 

Служебные скрипты FM

https://fitnessmama.school/pl/cms/layout/update?id=29679#js 

HTML

<!-- WhatsApp-Tlgt Web -->
$(function(){
    window.isMobile = /Mobile|webOS|BlackBerry|IEMobile|MeeGo|mini|Fennec|Windows Phone|Android|iP(ad|od|hone)/i.test(navigator.userAgent);
    var nint = setInterval(function() {
        if($('#whatsapp_button').length == 0) {
            if($(".user-phone-widget").length) {
                var phone = $('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"]').text().replace(/\D+/g,'');
                if(phone[0] == 3 && phone.length == 10) phone = "39"+phone;
                if(phone[0] == 9 && phone.length == 10) phone = "7"+phone;
                if(phone[0] == 8 && phone.length == 11) phone = "7"+phone.slice(1);
                phone = "+"+phone;
                $(".user-phone-widget").after(`
                <span>
                <button id="whatsapp_button" class="btn btn-sm btn-default" onclick="window.open((window.isMobile ? 'https://wa.me/' : 'https://web.whatsapp.com/send?phone=') + '${phone}')" style="
                margin: 3px 0;
                background-color: #25D366;
                color: white;
                padding: 4px 5px;
                border: none;
                border-radius: 30px;
                height: 22px;
                "><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="whatsapp" class="svg-inline--fa fa-whatsapp fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" style="width: 12px;"><path fill="currentColor" d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z"></path></svg>
                </button>
                <button id="whatsapp_button" class="btn btn-sm btn-default" onclick="window.open(('https://t.me/') + '${phone}')" style="
                padding: 4px 5px;    
                border: none;    
                height: 22px;
                width: 22px;
                background: url(https://upload.wikimedia.org/wikipedia/commons/8/82/Telegram_logo.svg);
                background-size: cover;
                background-repeat: no-repeat;
                ">

                </span>`);
            }
        }
    },50);
});
<!-- WhatsApp-Tlgt Web -->

<!-- Превью в хранилище -->

<!-- Превью в хранилище -->
if(window.location.href.indexOf('/fileservice/control/account/') > -1) {
    $(function(){
        $('#w5-container table tr').each(function(i, row){
            let filetype = $(row).find("td:nth-child(4)").text().trim();
            let filelink = $(row).find("td:nth-child(3) a").attr("href");
            if(["изображение", "image"].indexOf(filetype) > -1) {
                let thumb_img = "";
                if([".gif", ".svg"].indexOf(filelink.substring(filelink.length - 4)) == -1) {
                    let regex = /(.*)\/fileservice\/file\/download(?:\/.*\/)(\d*)\/.*\/(\d*)\/.*\/((?:.*)\w{32}[^\/]*)/gm;
                    let thumb_subst = `$1/fileservice/file/thumbnail/h/$4/s/200x/a/$2/sc/$3`;
                    thumb_img = filelink.replace(regex, thumb_subst);
                } else {
                    thumb_img = filelink;
                }
                $(row).find("td:nth-child(3)").append('<img src="'+thumb_img+'" style="display:block;max-width:200px;" />');
            } else if(["видео", "video"].indexOf(filetype) > -1 || !isNaN(parseInt(filetype))) {
                $(row).find("td:nth-child(3)").append('<video controls src="'+filelink+'" style="display:block;width:200px;height:112px;" />');
            }
        });
    });
}
<!-- Превью в хранилище -->

<!--  Показ ссылки для скачивания, при загрузке файла в ФХ -->
$(()=>{ if(window.location.href.indexOf('/fileservice/control/account/storage') > -1) {
    $('.uploadify-container').data('uploadifive').settings.onUploadComplete = function (e, res) {
        let $item = e.queueItem;
        let link = '/fileservice/control/account/file-by-hash?hash='+res+'&from=storage'
        $item.find('.fileinfo').html(` <a target="_blank" href="${link}">${res}</a> `,);
        $.get(link,(data)=>{
            var pageDom = $('<x/>').append($.parseHTML(data));
            newlink = pageDom.find('input.form-control[type="text"]').val();
            let linke = document.createElement('div');
            let linkc = document.createElement('a');
            $item.find('.filename').before(linke, linkc);
            $(linke).html(newlink)
            .css({"position":"absolute","left":"-99999px"});
            $(linkc).html('<i class="fa fa-clipboard" aria-hidden="true"></i> ')
            .css({"cursor":"pointer"})
            .on('click', function(){
                selectElement(linke);  
                $(linke).select();
                document.execCommand('copy');  
                let that = this;
                $(that).css('color','#ff00db');
                setTimeout(()=>{
                    $(that).css('color','');
                },1000);  
            });
        });
        function selectElement(element) {
            if (window.getSelection) {
                var sel = window.getSelection();
                sel.removeAllRanges();
                var range = document.createRange();
                range.selectNodeContents(element);
                sel.addRange(range);
            } else if (document.selection) {
                var textRange = document.body.createTextRange();
                textRange.moveToElementText(element);
                textRange.select();
            }
        }
    }
    }});
<!--  Показ ссылки для скачивания, при загрузке файла в ФХ -->

<!--  Добавляет возможность перетаскивать блоки настроек в редакторе страниц и уроков -->

if(
window.location.pathname.indexOf("/pl/cms/page/editor") > -1 || 
(
window.location.pathname == "/pl/teach/control/lesson/view" && 
window.location.search.indexOf("editMode=1") > -1
)
) {
    $( document ).ajaxSuccess(function( event, xhr, settings ) {
        if ( settings.url.indexOf("/pl/lite/block/get-setting") > -1 || settings.url.indexOf("/pl/lite/block/settings") > -1) {
            setTimeout(()=>{
                $('.setting-editor-popover, .block-style-popover')
                .draggable({ handle: '.popover-title', cancel: '.btn, input' })
                .find('.popover-title').css({'cursor':'move'});
            });
        }
    });
}

//РЕКЛАМНАЯ ПЛАШКА

// Чтобы исключить отображение для определенной страницы, добавьте путь в массив excludedPages через запятую.
// Например: ["/cms/system/login", "/another/page", "/some/other/page"];

const excludedPages = ["/voting_concurs_baza", "/waitlist_campaign_ticket", "/cms/system/login", "/pl/webinar/show", "/postura_login", "/giftshop", "/live12", "/cadou_personalizat"]; 
if (!excludedPages.includes(window.location.pathname)) {

	var chek = $('#ltBlock2055000206, #ltBlock2055000208, #ltBlock2055000229, #ltBlock2055000232'); // ID формы виджета
	var cookie_max_age = 24 * 60 * 60; //Время жизни cookie в секундах.
	var delay = 1; //Задержка показа в миллисекундах, 1000 = 1 секунде.

	if (getCookie('popup_per_day') !== 'true') {
    	setTimeout(function() {


    	    if (chek.length == 0 && !window.location.href.includes('/widget/')) {
        	    if ($('.gc-main-content').hasClass('with-left-menu')) {
            	    $('.gc-main-content').append('<div class="info-banner menu"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	} else {
                	$('.gc-main-content').append('<div class="info-banner"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	}
        	} else {
            	console.log('на странице форма с ГК');

        	}

        	$('.info-banner').append('<div class="close-mybtn"></div>');
      		$('.close-mybtn').click(function() {
      	    $('.info-banner').hide();
       	    setCookie('popup_per_day', 'true', { 'max-age': cookie_max_age });
       	 });
   	 }, delay);
 	};
};

//FUNCTIONS
function getCookie(name) {
    var matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ));
    return matches ? decodeURIComponent(matches[1]) : undefined;
}

function setCookie(name, value, options = {}) {

    options = {
        path: '/',
            secure: true,
            // при необходимости добавьте другие значения по умолчанию
            ...options
    };

    if (options.expires instanceof Date) {
        options.expires = options.expires.toUTCString();
    }

    var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

    for (var optionKey in options) {
        updatedCookie += "; " + optionKey;
        var optionValue = options[optionKey];
        if (optionValue !== true) {
            updatedCookie += "=" + optionValue;
        }
    }

    document.cookie = updatedCookie;
}

CSS  

/* убрать баннер */
.common-banner-wrapper {
  display:none!important;
}

/* Стили для Баннер как у Геткурс */
  .info-banner {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 10px; 
    left: 10px; 
    Z-index: 9;
        overflow: hidden;
        padding: 20px;
  }
  .info-banner.menu {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 20px; 
    left: 90px; 
    Z-index: 999;
        overflow: hidden;
        padding: 20px;
  }
    .info-banner img.banner {
        border-radius: 16px; /*радиус скругления изображения*/ 
        box-shadow: 0 0 6px 2px #00000069; /*настройки тени*/
    }
.close-mybtn {
    cursor: pointer;
    position: absolute;
    width: 25px;
    height: 25px;
    top: 10px;
    right: 10px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 10px 1px #00000038;
}

.close-mybtn:before {
    content: '✕';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    color: #000;
    font-weight: bold;
    line-height: 1;
    font-size: 14px;
    padding: 6px  6.5px;
}

  @media (max-width:  920px) {
    .info-banner {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */ 
      bottom: 10px; 
      left: 0px; 
    }
    .info-banner.menu {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */  
      bottom: 50px; 
      left: 0px; 
  }
  }
/* Стили для Баннер как у Геткурс */

 

Бот в WhatsApp

Бот в WhatsApp

Как сделать автоматические сообщения WhatsApp через Геткурс

На странице, где расположена кнопка WhatsApp вставить ссылку : 

https://api.whatsapp.com/send?phone=37360239852&text=Salut!%20Vreau%20s%C4%83-mi%20transmite%C8%9Bi%20antrenamentul%20pentru%20abdomen%20plat%20%C8%99i%20Webinarul%20despre%20nutri%C8%9Bie

где phone - это номер WhatsApp, привязанный к Геткурсу; text- любой желаемый текст (призыв к действию)

Снимок экрана 2025-04-01 в 12.53.29.png

У пользователя отображается уже готовое сообщение с текстом, которое он может отправить в один клик.

Далее создаем процесс ( или ветку в действующем процессе) по инструкции: https://textback.ru/knowledgebase/getcourse/ 

Важно! протестировать можно только через номер УЧЕНИКА. Сообщения в WhatsApp после входящего не придут, если номер в базе Геткурс значиться как СОТРУДНИКА.

Оформеление GC (до Remake)


Оформеление GC (до Remake)

Оформление бокового меню ГК

image.png
https://drive.google.com/file/d/103-7ZhGmtWc30PV3GXmUa9VeskELc1At/view?usp=sharing 

Скрипт в настройках аккаунта
image.png

<!-- Боковое меню -->
<link rel="stylesheet" href="https://fitnessmama.school/pl/cms/layout/css?id=29680&hash=9cc3105d9df0b69b9fa7b4db22f48c30&bundle=1" />
<script src="https://fitnessmama.school/pl/cms/layout/js?id=29680&hash=9cc3105d9df0b69b9fa7b4db22f48c30&bundle=1"></script>

CSS



/*Убираем бэкграунд иконки-пропадает ховер выделение */
.gc-account-leftbar .gc-account-user-menu li a {
   background-color: transparent!important;
}

/* Убираем разрыв */
.gc-account-leftbar .gc-account-user-menu li {
  border-bottom: none;
}

/* Прячем старую иконку чатиума полностью*/
li.menu-item-chatium {
  display:none;
}
/* Отступы между иконкой и выделением*/
.gc-account-leftbar .gc-account-user-menu li a.with-label {
    padding: 3px 0px 0px 0px!important;
    margin-top:10px;
}

/* Делает прозрачными места иконок + шрифт */
.gc-account-leftbar .gc-account-user-menu li a {
  background:none!important;
  font-family: 'Urbanist', sans-serif;
  font-style: normal;
  font-weight: 700;
  font-size: 11px; 

}

/* Подпись для новой*/
.gc-account-user-menu li.menu-item.new-chatium-icon a:after{
  content: "Chatium";
  color: #000;
  bottom: 2px!important;
  font-weight: 600;
}


/*Задаем выделение ярлыка*/
.custom-menu .gc-account-leftbar .gc-account-user-menu li.active a, .custom-menu .gc-account-leftbar .gc-account-user-menu li.selected a {
    background-color: #FFF!important;
}

li.menu-item.menu-item-profile a, li.menu-item.menu-item-notifications_button_small a, li.menu-item.menu-item-cms a, li.menu-item.menu-item-teach a, li.menu-item.menu-item-user a, li.menu-item.menu-item-tasks a, li.menu-item.menu-item-notifications a, li.menu-item.menu-item-sales a, li.menu-item.menu-item-chatium a {
    display: block;
    background: transparent;
    margin: 3px auto 0px;
    width: 62px !important;
  	height: 62px !important;
    border-radius: 8px;
    transition: all 1.0s;
}
/* пододвигаем колокольчик */
li.menu-item.menu-item-notifications_button_small a {
    height: 35px !important;
    border-radius: 5px;
}
/*Скругление профиля*/
.menu-item-profile .menu-item-icon {
    border-radius: 26px;
    width: 52px;
    border: 2px solid #EB1a41;
    margin-top:5px;
}

/*Позицианируем номерки*/
.gc-account-leftbar li:not(.menu-item-profile):not(.menu-item-notifications_button_small) .notify-count { 
  bottom: unset;

  top: 0%;
}

/* Шайк меню */
.gc-account-user-menu .menu-item a:hover img

{


  
	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
}

 .gc-account-user-menu .menu-item a:hover:after, 
.menu-item-prolongation a:hover img,
.menu-item.new-chatium-icon a:hover img
{

	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
} 
  
.notify-count {
  z-index:1;
}

@-webkit-keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
@keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
 

/*_____________Настройка суб меню___________________*/
/*Настройка суб меню______________*/
<!--  Настройка суб меню -->
.gc-account-leftbar .gc-account-user-submenu-bar {
    width: 320px;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li a {
   padding-top: 9px;
   padding-bottom: 9px;
   text-transform: lowercase;
   font-family: 'Urbanist', sans-serif;
   font-weight: 500!important;
   font-style: normal;
   font-size: 22px;
   line-height: 108.5%;
   padding-left: 20px;
}

/*Суб меню с заглавной*/
.gc-account-user-submenu-bar .gc-account-user-submenu li a::first-letter {
  text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:first-letter {
   text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:hover {
   color: #555555;
}

/*Заголовок субменю_*/
.gc-account-user-submenu-bar h3 {
   font-family: 'Urbanist', sans-serif;
   font-weight: 700!important;
  color: #004456;
   font-size: 30px;
   line-height: 40px;

}
.gc-account-leftbar .gc-account-user-submenu-bar {
   display: flex;
   flex-direction: column;
  background: #FFF;
}
.gc-account-leftbar .gc-account-user-submenu-bar:after {
   content: "";
   display: block;
   height: 60px;
   background: url("https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/323/h/2a01bc7dda6cdfa74cb5e627822c51f2.png") center / contain no-repeat;
   margin-top: auto;
   margin-bottom: 20px;
}

/* Анимация выбора меню */
.gc-account-user-submenu-bar .gc-account-user-submenu li {
    position: realtive;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a {
    position: relative !important;
    z-index: 9999;
    transition: all 1.3s;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li::after {
    content: "";
    width: 0%;
    height: 100%;
    position: absolute;
    background:  silver;
    top:0;
    left:0;
    transition: all .5s;
    z-index: 0;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a:hover {
    background: transparent;
    color:#005B63;
    z-index: 1;
    text-decoration: none;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li:hover::after {
    width: 100%;
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu {
		margin-bottom: 45px;
		background: #5E2E92;
		width: 70px;
		height: 100%;
	}
	.gc-main-content.with-left-menu {
		margin-left: 0;
	}
}

@media (max-width: 576px) {
	.gc-account-leftbar
		.gc-account-user-submenu-bar-notifications_button_small {
		width: calc(100vw - 70px);
		overflow: auto;
	}
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu li {
		border-bottom: none;
	}
}


.gc-account-user-menu  {

 font-family: 'Urbanist', sans-serif!important;

}

.popover {
	z-index: 8888;
}

JS

<!--  Подмена пункта меню Chatium -->
$(function() {
  setTimeout(function(){
    $(".menu-item-sales").after(
       '<li class="menu-item new-chatium-icon">'+
        '<a href="/chatium" title="Chatium">'+
          '<img class="menu-item-icon" src="https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/31/h/80723613363bcb010a2e0e6a98a90c65.png">'+
        '</a>'+
      '</li>'
    ); 
  },0);
});
<!--  END Подмена ссылки на chatium -->

<!--  Установка активности пунктов на подмененных ссылках-->
$(document).ready(function(){
	setTimeout(function(){
		if (window.location.pathname.startsWith("/chatium")) {
			$('.gc-account-user-menu li').removeClass('active');
			$('.gc-account-user-menu li.new-chatium-icon').addClass('active');
		}
		
        if (window.location.pathname.startsWith("/profile")) {
			$('.gc-account-user-menu li').removeClass('active');
		}
	}, 10);
});

<!--  Подмена ссылок на профиль и смену пароля -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/cms/counters/menu" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-profile a").attr("href", "/profile");
      $(".gc-account-user-submenu-bar li.menu-item-change_password a").attr("href", "/changePassword");
    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена ссылок на профиль и смену пароля -->

<!--  Подмена страницы личного кабинета -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/teach/control/stream" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-teach a").attr("href", "/l_kabinet");

    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена страницы личного кабинета -->

<!-- Боковое меню фикс сохранение подменный профиль-->
$(()=>{setTimeout(()=>{
  $(".edit-profile-popup-btn").off().click((e)=>{
    e.stopPropagation();
    window.open('/profile', '_parent');
  });
})});
<!-- Боковое меню фикс сохранение подменный профиль-->

Оформеление GC (до Remake)

Карточка тренинга в GC

.stream-table { 
  margin-left:0!important;
}

.stream-table tbody {
  display:flex;
  flex-wrap: wrap;
}

.stream-table tbody tr {
  position:relative;
  flex:0 0 calc(33.3333% - 20px);
  height:350px;
  border-radius:9px;
  box-shadow:0 0 3px 1px rgba(0,0,0,0.1);
  overflow:hidden;
  margin:10px;
  transition:all 0.5s;
}

@media (max-width:850px) {
  .stream-table tbody tr {
    flex:0 0 calc(50% - 20px);
  }
      .stream-table tbody tr {
    height:310px;
  }
}

@media (max-width:510px) {
  .stream-table tbody tr {
      flex:0 0 100%;
  }
}

.stream-table tr a {
	height: 100%;
    width:100%;
	z-index: 2;
	position: relative;
}

.stream-table tbody tr:hover {
  transform:scale(1.05);
}

.stream-table tbody tr td {
  position:relative;
  display:flex;
  height:100%;
  width:100%;
  padding:0!important;
}

/* Настраиваем заголовок */
.stream-table tbody tr td .stream-title {
  position:absolute;
  top:185px; 
  color:black!important;
  z-index:1;
  margin:auto 20px;
}

/* Настраиваем описание */
.stream-table tbody tr td div {
  display: none;
  position:absolute;
  top:285px;
  margin:auto 20px;
    line-height:1.4em;
}


.stream-table tbody tr td:before {
  content:"Deschide ";
  position:absolute;
  top:310px;
  left:20px;
  padding:5px 7px;
  border:1px solid black;
  border-radius:5px;
  transition:all 0.3s;
}

.stream-table tbody tr td:hover:before {
  background:rgb(228, 22, 122);
  color:white;
}

.stream-table tbody tr.no-public td:before {
  display:none;
}


.stream-table tbody tr td:after {
  content:"";
  position:absolute;
  top:0;
  left:0;
  width:100%;
  height:180px;
background: #8E2DE2;
background: -webkit-linear-gradient(to right, #4A00E0, #8E2DE2);
background: linear-gradient(to right, #4A00E0, #8E2DE2);
}

.stream-table tbody tr[data-training-id="934063181"] td:after {         
    background:url(https://fs.getcourse.ru/fileservice/file/download/a/87136/sc/239/h/71f4ed3e615b77040c1fd4aaf9648be0.jpg) no-repeat;
  background-size:cover;
  background-position: 0 40%;
}

 

Оформеление GC (до Remake)

Стилизация страниц со списком уроков FM

.lesson-list li.user-state-not_reached .info {
  border-left: 1px solid #ecf0f1;
  background: #d3d3d3;
}

.lesson-list-01 .state-icon-block {
Color: white;
}

.lesson-list-01 .lesson-list li {
    margin:20px!important;
      box-shadow:0 0 10px rgba(0,0,0,.5);
    }

.lesson-list {
    margin: 0px;
    padding: 0px;
    list-style: none;
    background: white;
    padding: 10px 0px;
    margin-bottom: 20px;
  border-radius:0px;
}

.lesson-list li .item-a {
    border-top-left-radius: 0px;
    border-bottom-left-radius: 0px;
 background: #f7f7f7;
  
}

.user-state-bg {
    background: #f7f7f7;
}
.lesson-list li .state-icon-block {
    background: #f80070;
}

.lesson-list li .info {
 border-radius:15!important;
    margin-left: 60px;
    padding-top: 0px;
    height: 100%;
    background: #f7f7f7;
}

.lesson-list li .title {
    font-size: 25px;
    font-weight: normal;
    line-height: 24px;
    margin-right: 20px;
    display: block;
    max-width: 500px; 
}



.lesson-list li .info {
    margin-left: 0;
    width: auto;
}

.lesson-list li table td {
    vertical-align: middle;
    min-height: 180px;
}

.lesson-list li .item-image {
    display: flex;
}

 

Оформеление GC (до Remake)

Изображения из кода оформления

Убрали во всех тренингах и подтренингах код оформления.
Код оформления сохранили в вики.
Собрали из кода все ссылки на тренинги и соответствующие изображения в отдельной таблице.
Старался не пропускать какие-то дочерние подтренинги, но думаю есть не большой шанс что то упустить.

https://docs.google.com/spreadsheets/d/1nTtFkirQSJiWBujLhNuHQ8_kPhBZe-EQWCoOxhCXEFw/edit?gid=0#gid=0

Гибкие права доступа

Таблица с правами

https://docs.google.com/spreadsheets/d/1Cp0ymngh0kfGEgZ9UMkN5gxa4bSTxdw2I3bvBtJbZ3w/edit?gid=0#gid=0 

Видео поясненение

https://www.loom.com/share/08e0df245660404b8a3f3f596fb5cafa 

Скрипт

<script>
  const sheetBaseUrl = 'https://docs.google.com/spreadsheets/d/1Cp0ymngh0kfGEgZ9UMkN5gxa4bSTxdw2I3bvBtJbZ3w/gviz/tq?tqx=out:csv';
  const accessSheetUrl = sheetBaseUrl + '&sheet=Доступ';
  const superUserSheetUrl = sheetBaseUrl + '&sheet=SUPERUSERS';

  const currentPath = window.location.pathname.toLowerCase();
  const userId = String(window.accountUserId).trim();

  const waitForUserInfo = setInterval(() => {
    const user = window.userInfo;
    if (!user) return;
    clearInterval(waitForUserInfo);

    const hasAccessRole = user.isAdmin || user.isManager || user.isTeacher;
    if (!hasAccessRole) return;

    Promise.all([
      fetch(accessSheetUrl).then(r => r.text()),
      fetch(superUserSheetUrl).then(r => r.text())
    ])
    .then(([accessCsv, superCsv]) => {
      const superUsers = superCsv
        .trim()
        .split('\n')
        .flatMap(row => row.split(','))
        .map(id => id.replace(/["\r\n]/g, '').trim())
        .filter(Boolean);

      if (superUsers.includes(userId)) return;

      const rows = accessCsv.trim().split('\n'); // 👈 теперь БЕЗ slice(1)
      const cleanRows = [];

      for (const row of rows) {
        const parts = row.split(',').map(p => p.replace(/["\r\n]/g, '').trim());
        const basePath = parts[1]?.toLowerCase() || "";
        const ids = parts.slice(2).filter(Boolean);

        if (basePath.length >= 3) {
          cleanRows.push({ basePath, ids });
        }
      }

      const matchedRow = cleanRows.find(r => currentPath.includes(r.basePath));

      if (matchedRow) {
        if (matchedRow.ids.includes(userId)) {
          console.log(`✅ Доступ разрешён к "${matchedRow.basePath}"`);
        } else {
          console.warn(`❌ Доступ запрещён — ID не найден в строке "${matchedRow.basePath}"`);
          window.location.replace('/redirect-acces');
        }
      } else {
        console.log("🟢 Путь не ограничен — доступ открыт");
      }
    })
    .catch(err => console.error('❌ Ошибка загрузки:', err));
  }, 100);
</script>

Боковая панель FM

JS

<!--  Подмена пункта меню Chatium -->
$(function() {
  setTimeout(function(){
    $(".menu-item-sales").after(
       '<li class="menu-item new-chatium-icon">'+
        '<a href="/chatium" title="Chatium">'+
          '<img class="menu-item-icon" src="https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/31/h/80723613363bcb010a2e0e6a98a90c65.png">'+
        '</a>'+
      '</li>'
    ); 
  },0);
});
<!--  END Подмена ссылки на chatium -->

<!--  Установка активности пунктов на подмененных ссылках-->
$(document).ready(function(){
	setTimeout(function(){
		if (window.location.pathname.startsWith("/chatium")) {
			$('.gc-account-user-menu li').removeClass('active');
			$('.gc-account-user-menu li.new-chatium-icon').addClass('active');
		}
		
        if (window.location.pathname.startsWith("/profile")) {
			$('.gc-account-user-menu li').removeClass('active');
		}
	}, 10);
});

<!--  Подмена ссылок на профиль и смену пароля -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/cms/counters/menu" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-profile a").attr("href", "/profile");
      $(".gc-account-user-submenu-bar li.menu-item-change_password a").attr("href", "/changePassword");
    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена ссылок на профиль и смену пароля -->

<!--  Подмена страницы личного кабинета -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/teach/control/stream" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-teach a").attr("href", "/l_kabinet");

    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена страницы личного кабинета -->

<!-- Боковое меню фикс сохранение подменный профиль-->
$(()=>{setTimeout(()=>{
  $(".edit-profile-popup-btn").off().click((e)=>{
    e.stopPropagation();
    window.open('/profile', '_parent');
  });
})});
<!-- Боковое меню фикс сохранение подменный профиль-->

CSS

/*Убираем бэкграунд иконки-пропадает ховер выделение */
.gc-account-leftbar .gc-account-user-menu li a {
   background-color: transparent!important;
}

/* Убираем разрыв */
.gc-account-leftbar .gc-account-user-menu li {
  border-bottom: none;
}

/* Прячем старую иконку чатиума полностью*/
li.menu-item-chatium {
  display:none;
}
/* Отступы между иконкой и выделением*/
.gc-account-leftbar .gc-account-user-menu li a.with-label {
    padding: 3px 0px 0px 0px!important;
    margin-top:10px;
}

/* Делает прозрачными места иконок + шрифт */
.gc-account-leftbar .gc-account-user-menu li a {
  background:none!important;
  font-family: 'Urbanist', sans-serif;
  font-style: normal;
  font-weight: 700;
  font-size: 11px; 

}

/* Подпись для новой*/
.gc-account-user-menu li.menu-item.new-chatium-icon a:after{
  content: "Chatium";
  color: #000;
  bottom: 2px!important;
  font-weight: 600;
}


/*Задаем выделение ярлыка*/
.custom-menu .gc-account-leftbar .gc-account-user-menu li.active a, .custom-menu .gc-account-leftbar .gc-account-user-menu li.selected a {
    background-color: #FFF!important;
}

li.menu-item.menu-item-profile a, li.menu-item.menu-item-notifications_button_small a, li.menu-item.menu-item-cms a, li.menu-item.menu-item-teach a, li.menu-item.menu-item-user a, li.menu-item.menu-item-tasks a, li.menu-item.menu-item-notifications a, li.menu-item.menu-item-sales a, li.menu-item.menu-item-chatium a {
    display: block;
    background: transparent;
    margin: 3px auto 0px;
    width: 62px !important;
  	height: 62px !important;
    border-radius: 8px;
    transition: all 1.0s;
}
/* пододвигаем колокольчик */
li.menu-item.menu-item-notifications_button_small a {
    height: 35px !important;
    border-radius: 5px;
}
/*Скругление профиля*/
.menu-item-profile .menu-item-icon {
    border-radius: 26px;
    width: 52px;
    border: 2px solid #EB1a41;
    margin-top:5px;
}

/*Позицианируем номерки*/
.gc-account-leftbar li:not(.menu-item-profile):not(.menu-item-notifications_button_small) .notify-count { 
  bottom: unset;

  top: 0%;
}

/* Шайк меню */
.gc-account-user-menu .menu-item a:hover img

{


  
	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
}

 .gc-account-user-menu .menu-item a:hover:after, 
.menu-item-prolongation a:hover img,
.menu-item.new-chatium-icon a:hover img
{

	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
} 
  
.notify-count {
  z-index:1;
}

@-webkit-keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
@keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
 

/*_____________Настройка суб меню___________________*/
/*Настройка суб меню______________*/
<!--  Настройка суб меню -->
.gc-account-leftbar .gc-account-user-submenu-bar {
    width: 320px;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li a {
   padding-top: 9px;
   padding-bottom: 9px;
   text-transform: lowercase;
   font-family: 'Urbanist', sans-serif;
   font-weight: 500!important;
   font-style: normal;
   font-size: 22px;
   line-height: 108.5%;
   padding-left: 20px;
}

/*Суб меню с заглавной*/
.gc-account-user-submenu-bar .gc-account-user-submenu li a::first-letter {
  text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:first-letter {
   text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:hover {
   color: #555555;
}

/*Заголовок субменю_*/
.gc-account-user-submenu-bar h3 {
   font-family: 'Urbanist', sans-serif;
   font-weight: 700!important;
  color: #004456;
   font-size: 30px;
   line-height: 40px;

}
.gc-account-leftbar .gc-account-user-submenu-bar {
   display: flex;
   flex-direction: column;
  background: #FFF;
}
.gc-account-leftbar .gc-account-user-submenu-bar:after {
   content: "";
   display: block;
   height: 60px;
   background: url("https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/323/h/2a01bc7dda6cdfa74cb5e627822c51f2.png") center / contain no-repeat;
   margin-top: auto;
   margin-bottom: 20px;
}

/* Анимация выбора меню */
.gc-account-user-submenu-bar .gc-account-user-submenu li {
    position: realtive;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a {
    position: relative !important;
    z-index: 9999;
    transition: all 1.3s;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li::after {
    content: "";
    width: 0%;
    height: 100%;
    position: absolute;
    background:  silver;
    top:0;
    left:0;
    transition: all .5s;
    z-index: 0;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a:hover {
    background: transparent;
    color:#005B63;
    z-index: 1;
    text-decoration: none;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li:hover::after {
    width: 100%;
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu {
		margin-bottom: 45px;
		background: #5E2E92;
		width: 70px;
		height: 100%;
	}
	.gc-main-content.with-left-menu {
		margin-left: 0;
	}
}

@media (max-width: 576px) {
	.gc-account-leftbar
		.gc-account-user-submenu-bar-notifications_button_small {
		width: calc(100vw - 70px);
		overflow: auto;
	}
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu li {
		border-bottom: none;
	}
}


.gc-account-user-menu  {

 font-family: 'Urbanist', sans-serif!important;

}

.popover {
	z-index: 8888;
}

Оформление Remake

Оформление Remake

Тема Remake

//Версия от 09.02.25 17:00

var layoutID = '00054';

//// Настройка видимости оформления Remake (customStyleVisibilityRule):
//// true - все
//// false - никто
//// window.userInfo.isAdmin - админы (не работает в чатиуме) 
//// window.accountUserId == 216415659 - только пользователь с таким ID
//// window.userInfo.isAdmin && window.accountUserId != 348017492;  — админы за исключением конкретного пользователя
//// window.userInfo.isAdmin || [216415659, 123456789, 987654321].indexOf(window.accountUserId) > -1; — админы и конкретные пользователи
/* 
var customStyleVisibilityRule = 
    window.userInfo.isAdmin 
    || [216415659, 123456789, 987654321].indexOf(window.accountUserId) > -1; 
// админы и конкретные пользователи */

var customStyleVisibilityRule = true; 

let remakeTopMenu = {
  init: true,
  links: [
	{
		name: "Scrieți suportului tehnic",
		link: "javascript: m_custom_btn_click()",
		icon: "https://remake-proxy.ru/themes/images/icons/chat-icon.svg",
	},
  ]
}

// Компактное меню на всех страницах (раскомментируйте код ниже, чтобы включить)
// $(()=>{$('body').addClass('compact-menu compact-menu-by-default')});

function extraScriptsX() {
/****************************/
/*       Extra Scripts      */       
/****************************/

     /* ВСТАВЛЯЙТЕ ДОПОЛНИТЕЛЬНЫЙ КОД ЗДЕСЬ */    
    if(window.PageChecker.isPaymentsPage) {
    	$('.xdget-partialpay span[style="color: #186905"]').text('Disponibilă achitarea parțială a comenzii')
    }
    
    if(window.PageChecker.isWebinarPage) {
        let webinalInter = setInterval(function(){
            if ($('.broadcast-started').length) {
            	clearInterval(webinalInter)
                $('.broadcast-started').text('Webinarul a început, fă click pe ecran')
            }
        },100)
    }

/****************************/
/*     END Extra Scripts    */       
/****************************/

////////////////////////////////////////////
//     Дальше ничего трогать не нужно!    //
////////////////////////////////////////////

// START Remake Support Block
if(window.userInfo.isAdmin && !$('meta[property="og:title"]').length) {

$(document).on('remake-left-menu-ready',function(){
  let $styles = $(`
<style>
body #gcAccountUserMenu .custom-btns-wrapper {
    margin-top: 0;
}
body #gcAccountUserMenu .remake-support-wrapper {
    margin-top: 0;
}
body #gcAccountUserMenu .custom-btns-wrapper .menutoggle-btn {
    margin-bottom: 0;
}
body #gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support {
    color: var(--color-3);
    background: none!important;
    padding-top: 5px;
    padding-bottom: 5px;
}
body #gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support:before {
   transition: background 0.2s;
   background: var(--color-3);
   mask-image: url(https://remake-proxy.ru/themes/images/icons/headphones-support.svg);
   -webkit-mask-image: url(https://remake-proxy.ru/themes/images/icons/headphones-support.svg); 
}
body #gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support:hover:before {
   background: var(--color-3-1);
}
#gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support span:before {
    content:"Тех.поддержка Remake";
}
#chatra:not(.chatra--expanded) {  visibility: hidden !important;  opacity: 0 !important;  pointer-events: none;  transition: none; }
</style>
  `);
  let $remake_support_wrapper = $(`
    <div class="custom-btns-wrapper remake-support-wrapper">
      <a class="custom-btn remake-support" href="https://t.me/RemakeGetCourse_bot" target="_blank"><span></span></a>
    </div>
  `);
  $('.custom-btns-wrapper').after($styles, $remake_support_wrapper);
  $remake_support_wrapper.prepend($('#gcAccountUserMenu .custom-btns-wrapper .menutoggle-btn'));
});
}
// END Remake Support Block

}; // END extraScriptsX, эти скобки не трогать


$(()=>{
  if(window.userInfo.isAdmin) {
    $('body').css('opacity','1'); $('html').addClass('loaded');
  }
});

$(document).on('remake-ready',()=>{
  extraScriptsX();
})

let customStyleSheetLayoutID;
if ((customStyleSheetLayoutID = /\/layout\/js\?id=(\d+)/.exec(document.currentScript.src)) !== null ||
    (customStyleSheetLayoutID = /\/layout\/js?.*&id=(\d+)/.exec(document.currentScript.src)) !== null ||
    (customStyleSheetLayoutID = /\/pl\/layout\/(\d+)/.exec(document.currentScript.src)) !== null) customStyleSheetLayoutID = customStyleSheetLayoutID[1];
var customStyleSheetX = "/pl/cms/layout/css?hash&bundle=1&id="+customStyleSheetLayoutID;

var remakeProxyX = "https://remake-proxy.ru";

(function(){

let remakeToggler = (() => {
  let matches = document.cookie.match(
    new RegExp(
      "(?:^|; )" +
      "remake-toggler".replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') +
      "=([^;]*)"
    )
  );
  return matches ? parseInt(decodeURIComponent(matches[1])) : 1;
})();

if (window.userInfo.isAdmin && !$('#remake-toggler').length) {
  if ($('#gcAccountUserMenu').length) remakeTogglerInit();
  else
    $(document).ajaxSend(function (event, xhr, settings) {
      if (settings.url == "/cms/counters/menu") remakeTogglerInit();
    });

  function remakeTogglerInit() {
    setTimeout(() => {
      let $remakeToggler = $(`
        <label for="remake-toggler">
          <span>Switch Remake</span>
          <style>
            #gcAccountUserMenu .custom-btns-wrapper label[for="remake-toggler"] {
              display: flex;
              justify-content: center;
              align-items: center;
              background: var(--m-custom-btn-color);
              padding: 14px;
              text-align: center;
              border-radius: 6px;
              font-family: var(--font-family-2a);
              font-style: normal;
              font-weight: normal;
              font-size: 16px;
              line-height: 120%;
              color: var(--m-item-active);
              margin-bottom: 10px;
              text-decoration: none;
              outline: none;
              transition: background-color .2s, border-radius .3s;
              color: var(--color-3,#222);
              background: none !important;
              padding-top: 5px;
              padding-bottom: 5px;
              cursor:pointer;
            }

            #gcAccountUserMenu label[for="remake-toggler"]:before {
              content: "";
              display: inline-block;
              width: 24px;
              height: 24px;
              margin-right: 5px;
              background: var(--m-item-active);
              mask-image: var(--paperplane-icon);
              -webkit-mask-image: var(--paperplane-icon);
              mask-size: contain;
              -webkit-mask-size: contain;
              mask-repeat: no-repeat;
              -webkit-mask-repeat: no-repeat;
              mask-position: center;
              -webkit-mask-position: center;
              mask-origin: content-box;
              -webkit-mask-origin: content-box;
              transition: background 0.2s;
              background: var(--color-3);
              mask-image: url(https://remake-proxy.ru/themes/images/icons/switch-remake-icon.svg);
              -webkit-mask-image: url(https://remake-proxy.ru/themes/images/icons/switch-remake-icon.svg);
            }

            label[for="remake-toggler"] input {
              display: none;
            }

            #gcAccountUserMenu label[for="remake-toggler"] span {
              display: inline-block;
              overflow: hidden;
              max-width: 300px;
              white-space: nowrap;
              transition: max-width 0.3s;
            }

            @media(min-width:769px) {
              body.compact-menu #gcAccountUserMenu label[for="remake-toggler"] span {
                max-width:0
              }
            }

	    #gcAccountUserMenu:not(.menu-ready) label[for="remake-toggler"] {
              height: fit-content;
              margin-top: auto;
              border-radius: 6px;
              background: #3d556d;
              padding: 10px 7px;
              margin-left: auto;
              margin-right: auto;
              display: flex;
              justify-content: center;
              text-align: center;
              align-items: center;
              cursor:pointer;

            }

            #gcAccountUserMenu:not(.menu-ready) label[for="remake-toggler"]:before {
              display:none
            }
                        #gcAccountUserMenu:not(.menu-ready) .gc-account-leftbar {
              display: flex;
              flex-direction: column;
            }

            #gcAccountUserMenu:not(.menu-ready) label[for="remake-toggler"] span {
              color:#fff;
              white-space: pre-wrap;
            }
          </style>
        </label>
      `);
      let $remakeTogglerRadio = $('<input id="remake-toggler" type="radio">');
      $remakeTogglerRadio
        .attr('checked', !!remakeToggler)
        .on('change', (e) => {
          e.preventDefault();
        });
      $remakeToggler
        .prepend($remakeTogglerRadio)
        .on('click', function (e) {
          if (
            window.confirm(
              "Для переключения оформления Remake страница будет перезагружена. Продолжить?"
            )
          ) {
            let $r = $(this).find('input');
            $r.prop('checked', !$r.is(':checked'));
            window.gcSetCookie("remake-toggler", $r.is(':checked') ? 1 : 0, {
              path: '/'
            });
            window.location.reload();
          }
          return false;
        });
      if (remakeToggler) {
        $('#gcAccountUserMenu').on('menu-ready', () => {
          $('#gcAccountUserMenu .custom-btns-wrapper').last().append($remakeToggler);
        });
      } else {
        $('#gcAccountUserMenu .gc-account-leftbar').append($remakeToggler);
      }
    });
  }
}

if (
  !customStyleVisibilityRule ||
  window.location.search.indexOf("originalview") > -1 ||
  !remakeToggler
) {
  $('#preloader-styles').remove();
  return false;
}
  
  if(typeof styleX_init != "undefined") return false;
  var styleX_init = 1; 
 
  CSSinjection(customStyleSheetX);

  setTimeout(()=>{ 

    if($('#gcAccountUserMenu').length) launchLeftMenuScripts(); 
    else $(document).ajaxSend(function(event, xhr, settings) {
      if ( settings.url == "/cms/counters/menu" ) launchLeftMenuScripts();
    });
    function launchLeftMenuScripts() {
      //js-cookie
      !function(e){var n;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var t=window.Cookies,o=window.Cookies=e();o.noConflict=function(){return window.Cookies=t,o}}}(function(){function f(){for(var e=0,n={};e<arguments.length;e++){var t=arguments[e];for(var o in t)n[o]=t[o]}return n}function a(e){return e.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}return function e(u){function c(){}function t(e,n,t){if("undefined"!=typeof document){"number"==typeof(t=f({path:"/"},c.defaults,t)).expires&&(t.expires=new Date(1*new Date+864e5*t.expires)),t.expires=t.expires?t.expires.toUTCString():"";try{var o=JSON.stringify(n);/^[\{\[]/.test(o)&&(n=o)}catch(e){}n=u.write?u.write(n,e):encodeURIComponent(String(n)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=encodeURIComponent(String(e)).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var r="";for(var i in t)t[i]&&(r+="; "+i,!0!==t[i]&&(r+="="+t[i].split(";")[0]));return document.cookie=e+"="+n+r}}function n(e,n){if("undefined"!=typeof document){for(var t={},o=document.cookie?document.cookie.split("; "):[],r=0;r<o.length;r++){var i=o[r].split("="),c=i.slice(1).join("=");n||'"'!==c.charAt(0)||(c=c.slice(1,-1));try{var f=a(i[0]);if(c=(u.read||u)(c,f)||a(c),n)try{c=JSON.parse(c)}catch(e){}if(t[f]=c,e===f)break}catch(e){}}return e?t[e]:t}}return c.set=t,c.get=function(e){return n(e,!1)},c.getJSON=function(e){return n(e,!0)},c.remove=function(e,n){t(e,"",f(n,{expires:-1}))},c.defaults={},c.withConverter=e,c}(function(){})});
      if (Cookies.get('compact-menu') === "true") $('body').addClass('compact-menu');
      let $menuStyleLink = $("<link>", {rel: "stylesheet", type: "text/css", href: remakeProxyX+"/pl/layout/"+layoutID+"/15/left-menu-styles.css", crossOrigin: "anonymous"});
      
      $menuStyleLink.on('load', ()=>{
          let wait_styles = setInterval(()=>{
            if($('html').css('order') == 1) {
              clearInterval(wait_styles);
              JSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/14/left-menu-scripts.js", ()=>{
                $(()=>{setTimeout(()=>{ 
                  $('html').addClass('page-ready');
                  $('#gcAccountUserMenu .gc-account-leftbar').stickySidebar({minWidth: 768});
                  $('#gcAccountUserMenu').trigger('menu-ready');
                })});
              });
            }
          });
      });
      $('link[href*="/nassets/"]:last').after($menuStyleLink);
   }

   $(()=>{
      if(
         !$('.gc-account-leftbar .m-account-logo').length && 
         (
           $('body.chatium_body').length ||
           window.navigator.userAgent.includes('ChatiumWebView') ||
           $('script[src*="getcourse_webview"]').length || 
           (window.location.pathname.indexOf('/pl/teach/control/lesson/webview') > -1)
         )
      ) { 
         CSSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/14/left-menu-styles.css", ()=>{
           JSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/14/left-menu-scripts.js", ()=>{
             $(()=>{setTimeout(()=>{ 
               $('html').addClass('page-ready');
             })});
           });
         });
         $('body').prepend(`
<div id="gcAccountUserMenu" class="menu-ready">
  <div class="gc-account-leftbar">
    <a href="javascript:void(0)" class="toggle-link without-icon"></a>
  </div>
</div>
        `);
         $(window).on('load', makeRemakeMenu);
      }
   });

   $(document).ajaxSuccess(function(event, xhr, settings) {
     if (settings.url == "/cms/counters/menu") {
       makeRemakeMenu(xhr.responseJSON || (typeof xhr.responseText === 'string' ? xhr.responseText : null))
     }
   });
        
  });

  function makeRemakeMenu(data = false) {
    let checkMenuReady = setInterval(()=>{
       if($('#gcAccountUserMenu').hasClass('menu-ready')) {
        clearInterval(checkMenuReady);
        let accountLogo = getComputedStyle($('html body').get(0)).getPropertyValue('--m-account-logo-mob') 
                          || getComputedStyle($('html').get(0)).getPropertyValue('--m-account-logo-mob');
        accountLogo = accountLogo.replace(/\s*url\(([^)]*)\)/, "$1").replace(/["']/g, '');
        $('#gcAccountUserMenu .gc-account-leftbar .toggle-link').off().html(`
          <a class="m-account-logo" href="javascript:void(0)" onclick="location.href=getComputedStyle($('#gcAccountUserMenu')[0]).getPropertyValue('--m-account-logo-url').replace(/['&quot;]/g,'')">
             <img height="100%" src="${accountLogo}" alt="">
          </a>
          <a class="m-search" href="javascript:void(0)" onclick="showMobSearch(event)"></a>
          <a class="m-notify" href="javascript:void(0)" onclick="showNotifications(event)">
			<span class="m-notify-icon"></span>
			<span class="notify-count"></span>
			</a>
          ${!(
           $('body.chatium_body').length ||
           window.navigator.userAgent.includes('ChatiumWebView') ||
           $('script[src*="getcourse_webview"]').length || 
           (window.location.pathname.indexOf('/pl/teach/control/lesson/webview') > -1)
          ) ? '<a class="m-burger-btn" href="javascript:void(0)" onclick="showMobMenu(event)"></a>':''}
        `);
        let counters = {
          "chatium-chatium_app": ".submenu-item-chatium_app",
          "chatium_updates": ".submenu-item-chatium_updates",
          "sales-my_deals": ".submenu-item-my_deals",
          "teach-answers": ".submenu-item-answers",
          "notifications-inbox": ".submenu-item-inbox",
        }
        if(data){
          let json_counters;
          if (typeof data === 'string') {
            json_counters = JSON.parse(data).counters || [];
          } else if (typeof data === 'object') {
            json_counters = data.counters || [];
          }
          $.each(json_counters, (name,val)=>{
            if(typeof counters[name] !== "undefined" && val!=0) {
              $(counters[name]).find('.submenu-notify-count').html(val);
            }
          });
          if(typeof json_counters.notifications_button_small !== "undefined" && json_counters.notifications_button_small!=0) {
            $('#gcAccountUserMenu .gc-account-leftbar .toggle-link > .m-notify > .notify-count').html(json_counters.notifications_button_small);
          }
        }
      }
    },10);
  }

  JSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/0/distributor.js", function(){    
    setTimeout(()=>{
      if($.active) {
        let q = 0;
        $(document).ajaxStop(function() { 
          if(!q++) {
            setTimeout(()=>{
              $(document).trigger('remake-ready'); 
            });
          }
        });
      } else {
        setTimeout(()=>{
          $(document).trigger('remake-ready'); 
        });
      }
    });
  });

})();

function JSinjection(fileName, callback) {
  var script = document.createElement( "script" )
  script.type = "text/javascript";
  if(typeof callback != "undefined") {
    if(script.readyState) {  // only required for IE <9
      script.onreadystatechange = function() {
        if ( script.readyState === "loaded" || script.readyState === "complete" ) {
          script.onreadystatechange = null;
          callback();
        }
      };
    } else {  //Others
      script.onload = function() {
        callback();
      };
    }
  }
  script.src = fileName;
  script.crossOrigin = "anonymous";
  document.getElementsByTagName( "head" )[0].appendChild( script );
}

function CSSinjection(fileName, callback) {
  var link = document.createElement("link");
  link.type = "text/css";
  link.rel = "stylesheet";
  link.crossOrigin = "anonymous";
  if(typeof callback != "undefined") {
    link.onload = callback();
  }
  link.href = fileName;
  document.head.appendChild(link);
}

 

Оформление Remake

Блок кода оформления Remake в Header

Шрифты и стили уведомления

<!-- Подключение шрифта и стилей для уведомления -->
<style>
@import url('https://fonts.googleapis.com/css2?family=Golos+Text:wght@400;500;600;700;800;900&display=swap');

.message-wrapper {
    width: 100%;
    position: fixed;
    left: 50%;
    bottom: 50px;
    background: #333;
    border-radius: 50px;
    display: flex;
    flex-direction: row;
    align-items: center;
    padding: 20px 40px;
    z-index: 10000;
    max-width: 1000px;
    animation: fadeIn 0.3s linear 1 forwards 5s;
    transform: translate(-50%, 10px);
    opacity: 0;
}

.message-wrapper.fadeOut {
    animation: fadeOut 0.3s linear 1 forwards;
}

.message-text,
.message-btn {
    font-family: 'Golos', 'Manrope', Helvetica, Arial, sans-serif;
    font-style: normal;
    font-weight: 400;
    font-size: 16px;
    line-height: 140%;
    color: #fff;
}

.message-text {
    padding-right: 20px;
}

.message-btn {
    border: none;
    cursor: pointer;
    background: #fff;
    border-radius: 30px;
    padding: 20px 89px;
    transition: 0.3s all;
    color: #333;
}

.message-btn:hover {
    opacity: 0.8;
}

.message-text a {
    border-bottom: 1px solid #fff;
    text-decoration: none;
    color: #fff !important;
}

@media (max-width: 991px) {
    .message-wrapper {
        flex-direction: column;
        justify-content: center;
        align-items: center;
        padding: 20px;
        border-radius: 20px;
    }
    .message-text {
        margin-bottom: 30px;
        margin-right: 0;
        padding-right: 0;
    }
}

@keyframes fadeIn {
    from {
        transform: translate(-50%, 10px);
        opacity: 0;
    }
    to {
        transform: translate(-50%, 0);
        opacity: 1;
    }
}

@keyframes fadeOut {
    from {
        transform: translate(-50%, 0);
        opacity: 1;
    }
    to {
        transform: translate(-50%, 10px);
        opacity: 0;
    }
}
</style>

Прелоадер для админа

<script>
if (window.userInfo.isAdmin) {
    document.write(`
        <style id="preloader-styles">
            body { opacity: 0; transition: opacity 0.3s; }
            html.loaded body { opacity: 1; }
            #gcAccountUserMenu { opacity: 0; }
            html.page-ready #gcAccountUserMenu { opacity: 1; }

            html:before {
                content: "";
                position: fixed;
                top: 50%;
                left: 50%;
                width: 40px;
                height: 40px;
                font-size: 10px;
                text-indent: -9999em;
                border: 5px solid transparent;
                border-bottom: 5px solid #333;
                border-left: 5px solid #333;
                transform: translate(-50%, -50%);
                border-radius: 100%;
                z-index: 10000;
                animation: remake-preloader 1s infinite linear;
            }

            html.loaded:before {
                opacity: 0;
            }

            @keyframes remake-preloader {
                0% { transform: translate(-50%, -50%) rotate(0deg); }
                100% { transform: translate(-50%, -50%) rotate(360deg); }
            }
        </style>
    `);
}
</script>

Уведомление о редизайне

<script>
(function() {
    $(() => {
        if ($('#gcAccountUserMenu').length && !localStorage.getItem("redesignPopupView")) {
            const $message = $(`
                <div class="message-wrapper">
                    <div class="message-text">
                        În curând, designul școlii va fi actualizat. Dacă ceva nu se afișează corect, reveniți peste 15 minute sau încercați să ștergeți memoria cache. 
                        <a href="https://support.google.com/accounts/answer/32050?hl=ro&co=GENIE.Platform%3DDesktop">Instrucțiuni pentru ștergerea memoriei cache</a>
                    </div>
                    <button class="message-btn">Închide</button>
                </div>
            `);

            $('body').append($message);

            $message.find(".message-btn").on("click", function () {
                localStorage.setItem("redesignPopupView", true);
                $message.addClass("fadeOut");
                setTimeout(() => $message.remove(), 1000);
            });
        }
    });
})();
</script>

Настройки прелоадера

<script>
const PRELOADER_REMAKE_READY_TIMEOUT = 1500;
const PRELOADER_FALLBACK_TIMEOUT = 7000;

const removePreloader = () => {
    $('body').css('opacity', '1');
    $('html').addClass('loaded page-ready');
};

$(document).on('remake-ready', () => {
    setTimeout(removePreloader, PRELOADER_REMAKE_READY_TIMEOUT);
});

setTimeout(removePreloader, PRELOADER_FALLBACK_TIMEOUT);
</script>

Подключение Remake и принудительная отрисовка

<!-- Подключение скрипта Remake -->
<script type="text/javascript" src="/pl/cms/layout/js?hash&bundle=0&id=52740"></script>

<!-- Резервное включение видимости после загрузки -->
<style>
    body {
        opacity: 0;
        transition: opacity 1ms linear;
    }
    #gcAccountUserMenu {
        opacity: 0;
    }
</style>

<script>
$(() => {
    setTimeout(() => {
        console.log("body loaded");
        $("body").css("opacity", "1");
        $("#gcAccountUserMenu").css("opacity", "1");
    }, 500);
});
</script>

 

 

Прямой переход ученика к открытому потоку (подтренингу)

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

Прямой переход ученика к открытому потоку (подтренингу)

Настройка конкретного подтренинга

Direct-choice.png

1. Перейдите в настройки вида подтренинга-марафона, в котором находятся подтренинги-потоки.
2. Добавьте блок “Javascript” и разместите его последним блоком на странице.
3. В блок вставьте код из документа ниже:

$(document).ready(function () {
  if (!$('.gc-main-content').hasClass('gc-user-user')) return;

  const $streamTable = $('.stream-table');
  if (!$streamTable.length) return;

  const $subTrainingRows = $streamTable.find('tbody tr');

  if ($subTrainingRows.length === 1) {
    const link = $subTrainingRows.find('a').attr('href');
    if (link) window.location.href = link;
  }
});

Пример действий:

В результате, если ученику в тренинге виден только один подтренинг, он будет автоматически переходить в него: 

Если же более одного, то пользователь остается на странице тренинга: 

Прямой переход ученика к открытому потоку (подтренингу)

Глобальная настрока

Вставьте представленный ниже код в «Настройки аккаунта» - «Счетчики и прочие скрипты для BODY» 

$(document).ready(function () {
  if (!$('.gc-main-content').hasClass('gc-user-user')) return;

  const $streamTable = $('.stream-table');
  if (!$streamTable.length) return;

  const $subTrainingRows = $streamTable.find('tbody tr');

  if ($subTrainingRows.length === 1) {
    const link = $subTrainingRows.find('a').attr('href');
    if (link) window.location.href = link;
  }
});

Пример:

ins_code_for_dir_access_to_child_training.jpg

 Сохраните изменения.

Если ранее вставляли этот код непосредственно в тренинг, удалите из тренинга.