/* * 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();