/* * Hide blocks for groups * Copying prohibited! * Developer: Fumuse (https://forumd.ru/profile.php?id=7907 | https://fumuse.ru/) */ class HideBlock { userGroup = 3; groupLists = [ {"id": 3, "name": "Гость"}, {"id": 7, "name": "Игроки до 18+"}, {"id": 5, "name": "Новые пользователи"}, {"id": 6, "name": "Реклама"}, ]; blockList = []; constructor() { this.blockList = document.querySelectorAll('.hideblock'); this.userGroup = window["GroupID"] || 3; //current user group this.hideBlock(); this.bbButton(); } hideBlock() { if (this.blockList.length <= 0) return; this.blockList.forEach((block, index) => { this.blockChangeDom(block); let groups = this.parseGroups(block.dataset.group); //hide from guests if (groups.length === 0) groups = [3]; let hasAccess = this.checkUserAccess(groups); if (!hasAccess) { this.hiddenBlockContent(block); } }) } /** * Изменение вёрстки блока для большей схожести с блоком скрытого текста * @param block */ blockChangeDom(block) { let html = block.innerHTML; block.innerHTML = "Скрытый текст:
" + html + ""; } /** * Разбор строки-настроек в блоке со скрытым текстом * @param groups * @returns {*[]|*|string[]} */ parseGroups(groups) { if (!groups) return []; groups = groups.split(","); if (groups.length > 0) { groups.forEach((group, index) => { groups[index] = Number(group); }); return groups; } return []; } /** * Проверка доступа к блоку со скрытым текстом * @param groups * @returns {*} */ checkUserAccess(groups) { return !groups.includes(this.userGroup); } /** * Скрытие блока от групп, которые не могут видеть этот блок * @param block */ hiddenBlockContent(block) { block.querySelector("blockquote").innerHTML = "
Этот текст доступен для просмотра только определённым группам.
"; } /** * Кнопка группового скрытия на панели бб-кодов */ bbButton() { let buttonPanelHide = document.getElementById('button-hide'); if (!buttonPanelHide) return; this.bbButtonPanel(); let newButton = document.createElement('td'); newButton.id = 'button-grouphide'; newButton.innerHTML = '
';
buttonPanelHide.parentElement.insertBefore(newButton, buttonPanelHide);
}
/**
* Открывающийся блок после нажатия на кнопку на бб-панели
*/
bbButtonPanel() {
let __this = this;
let editor = FORUM.get('editor');
editor.grouphide = {
name: "Скрытый текст для групп",
onclick: () => {
__this.panelToggle("grouphide-area");
},
};
let tagsContainer = document.getElementById('tags');
let container = document.createElement('div');
container.id = "grouphide-area";
container.classList.add("container");
container.style.display = 'none';
tagsContainer.append(container);
this.bbButtonPanelGroupsList(container);
this.bbButtonPanelEndButton(container);
}
/**
* Отрисовка списка групп на открывающейся бб-панели
* @param container
*/
bbButtonPanelGroupsList(container) {
this.groupLists.forEach(group => {
let element = document.createElement('label');
element.innerHTML = ' ' + group.name;
container.append(element);
});
}
/**
* Итоговая кнопка на бб-панели
* @param container
*/
bbButtonPanelEndButton(container) {
let __this = this;
let button = document.createElement('input');
button.type = 'button';
button.classList.add('button');
button.value = 'Скрыть текст для выделенных групп';
button.addEventListener('click', function () {
let parent = this.closest('#grouphide-area');
let linked = [];
let inputs = parent.querySelectorAll('input[type="checkbox"]');
inputs.forEach(input => {
if (!input.checked) return;
linked.push(input.value);
input.checked = false;
});
if (linked.length <= 0) bbcode('[ghide]', '[/ghide]');
else {
bbcode('[ghide=' + linked.join(',') + ']', '[/ghide]');
}
__this.panelToggle("grouphide-area");
});
container.append(button);
}
/**
* Открытие панели с выбором групп
* @param e
*/
panelToggle(e) {
let t = document.getElementById(e);
null != t && void 0 !== t && ("none" == t.style.display ? $(t).show() : $(t).hide())
}
}
const hideBlock = new HideBlock();