'use strict' /** * Страница настроек ВКонтакте */ class page { constructor() { /** * Идентификатор (https://vk.com/settings?act=ЗНАЧЕНИЕ) */ this.id = 'nadrez'; /** * Иконки ВКонтакте для полей */ this.icons = { lightning: 'icon_type_ienable', sound: 'icon_type_isounds', text: 'icon_type_itexts', bell: 'icon_type_notification', group: 'icon_type_group_messages ', message: 'icon_type_message', reminder: 'icon_type_message_reminders', like: 'icon_type_like', repost: 'icon_type_repost', comment: 'icon_type_comment', discussion: 'icon_type_discussions', wall: 'icon_type_wall', reply: 'icon_type_story_reply', question: 'icon_type_story_question', voting: 'icon_type_voting', clips: 'icon_type_clips', mention: 'icon_type_mention', follow: 'icon_type_follow', friend: 'icon_type_friend_found', invite: 'icon_type_invite_group', tag: 'icon_type_photo_tag', birthday: 'icon_type_birthday', event: 'icon_type_event', group: 'icon_type_group', promo: 'icon_type_feed_promo', advice: 'icon_type_advice', post: 'icon_type_new_post', private: 'icon_type_private_post', gift: 'icon_type_gift', app: 'icon_type_invite_app', live: 'icon_type_live', playlists: 'icon_type_video_playlists', podcast: 'icon_type_podcast', ads: 'icon_type_ads', achievements: 'icon_type_content_achievements', services: 'icon_type_services', installation: 'icon_type_service_installation', bookmarks: 'icon_type_bookmarks', box: 'icon_type_market_orders', announcement: 'icon_type_tear_off_flyer_fill_blue', hearts: 'icon_type_hearts_2_circle_fill_twilight', email: 'icon_type_email', clock: 'icon_type_clock' }; /** * Инициализация */ this.init = function () { // Инициализация страницы this.clean(); // Инициализация модулей let modules = { killer: new killer() }; // Инициализация блоков this.blocks.group( 'nadrez', this.blocks.header('надрез мозжечка'), // text('Системные настройки'), this.blocks.fields.checkbox('activate', 'lightning', 'Активировать') ); this.blocks.group( 'killer', this.blocks.header('Убийца'), // text('Удаление активности выбранных пользователей'), this.blocks.fields.checkbox('activate', 'lightning', 'Активировать'), this.blocks.fields.checkbox('list', 'lightning', 'Заблокированные ВКонтакте', 'Удалять тех кто находится в списке заблокированных ВКонтакте'), this.blocks.fields.checkbox('target', 'list', 'Отдельный список на удаление', 'Выбрать пользователей вручную'), modules.killer.list('asdasd'), ); } /** * Найти оболочку * * @return {Element} Оболочка */ this.body = function () { return document.getElementById('wide_column'); } /** * Очистка оболочки от HTML-элементов ВКонтакте */ this.clean = function () { // Инициализация тела оболочки let main = this.body(); // Очистка тела оболочки main.innerHTML = null; } /** * Блоки */ this.blocks = { /** * Запись верхнего колонтинула оболочки (обычный) * * @param {string} text * * @return {Function} Функция для выполнения в генераторе группы */ header(text = '') { /** * Запись в группу (подразумевается выполнение в функции генерирующую группу) * * @param {string} group Группа * * @return {bool} Статус выполнения */ return function (group) { if (typeof group === 'string' && typeof text === 'string') { // Пройдена проверка входных параметров // Инициализация блока куда надо записать заголовок let block = document.getElementById('block_' + group); // Инициализация оболочки заголовка let title = block.getElementsByTagName('h2')[0].getElementsByClassName('page_block_header')[0]; // Запись содержимого в буфер let buffer = title.cloneNode(true); // Запись заголовка title.innerText = text; // Запись содержимого заголовка из буфера for (let element of buffer.children) title.appendChild(element); return true; } return false; }; }, /** * Запись верхнего колонтинула оболочки (дополненный) * * @param {string} left Содержимое элемента с классами: "page_block_header_extra_left _header_extra_left" * @param {string} center Содержимое элемента с классами: "page_block_header_inner _header_inner" * @param {string} right Содержимое элемента с классами: "page_block_header_extra _header_extra" * * @return {Function} Функция для выполнения в генераторе группы */ header_extra(left = '', center = '', right = '') { /** * Запись в группу (подразумевается выполнение в функции генерирующую группу) * * @param {string} group Группа * * @return {bool} Статус выполнения */ return function (group) { if (typeof group === 'string' && typeof left === 'string' && typeof center === 'string' && typeof right === 'string') { // Пройдена проверка входных параметров // Инициализация блока let block = document.getElementById('block_' + group); // Инициализация оболочки заголовка let title = block.getElementsByTagName('h2')[0].getElementsByClassName('page_block_header')[0]; // Запись заголовков title.getElementsByClassName('page_block_header_extra_left _header_extra_left')[0].innerText = left; title.getElementsByClassName('page_block_header_inner _header_inner')[0].innerText = center; title.getElementsByClassName('page_block_header_extra _header_extra')[0].innerText = right; return true; } return false; }; }, /** * Запись нижнего колонтинула оболочки * * @param {string} value * * @return {Function} Функция для выполнения в генераторе группы */ footer() { /** * Запись в группу (подразумевается выполнение в функции генерирующую группу) * * @param {string} group Группа * * @return {bool} Статус выполнения */ return function (group) { if (typeof left === 'string' && typeof center === 'string' && typeof right === 'string') { // Пройдена проверка входных параметров // // Инициализация нижнего колонтинула оболочки // let footer = document.getElementsByClassName('settings_block_footer')[0]; // // Очистка нижнего колонтинула оболочки // // footer.innerHTML = null; // footer.remove(); return true; } return false; }; }, /** * Генерация HTML-элемента-оболочки * * @param {string} id Идентификатор * @param {...function} functions Содержимое * * @return {integer} Количество ошибок */ group(id, ...functions) { if (typeof id === 'string' && typeof functions === 'object') { // Пройдена проверка входных параметров // Инициализация названия идентификатора элемента let name = 'block_' + id; if (document.getElementById(name) === null) { // Не найден блок с данным идентификатором // Инициализация оболочки let block = document.createElement('div'); block.id = name; block.classList.add('page_block', 'clear_fix'); // Инициализация верхнего колонтинула let header = document.createElement('h2'); header.classList.add('page_block_h2'); // Инициализация заголовка let title = document.createElement('div'); title.classList.add('page_block_header'); title.innerText = id; // Инициализация статуса let status = document.createElement('div'); status.classList.add('page_block_saved'); status.innerText = 'Изменения сохранены'; // Инициализация оболочки содержимого let main = document.createElement('div'); main.classList.add('settings_panel', 'clear_fix', 'settings_' + this.core.id, 'settings_section_' + this.core.id); // Инициализация архитектуры title.appendChild(status); header.appendChild(title); block.appendChild(header); block.appendChild(main); // Запись в документ this.core.body().appendChild(block); } // Инициализация счётчика ошибок let errors = 0; functions.forEach(function (entry) { // Перебор переданных функций if (typeof entry === 'function') { // Пройдена проверка входных параметров // Генерация if (!entry(id)) ++errors; } }); return errors; } }, /** * Поля */ fields: { /** * Генерация HTML-элемента настройки с кнопкой активации * * @param {string} id Идентификатор * @param {string|null} name Название * * @return {Function} Функция для выполнения в генераторе группы * * @todo 1. Добавить проверку на существование нижнего колонтинула и записывать перед ним, вместо конца блока */ checkbox(id, icon, name, description) { // Инициализация ядра let core = this.core; /** * Запись в группу (подразумевается выполнение в функции генерирующую группу) * * @param {string} group Группа * * @return {bool} Статус выполнения */ return function (group) { if (typeof id === 'string' && typeof icon === 'string' && typeof core === 'object' && typeof group === 'string') { // Пройдена проверка входных параметров // Инициализация блока let block = document.getElementById('block_' + group); // Инициализация верхнего колонтинула блока let header = block.getElementsByClassName('page_block_header')[0]; // Инициализация элемента со статусом let status = header.getElementsByClassName('page_block_saved')[0]; // Инициализация тела блока let body = block.getElementsByClassName('settings_panel clear_fix settings_' + core.id + ' settings_section_' + core.id)[0]; settings.read(id).then(result => { // Инициализация оболочки кнопки активации let wrap = document.createElement('div'); wrap.classList.add('settings_separated_row', core.icons[icon] ?? core.icons['lightning'], 'settings_separated_row_iconed'); wrap.addEventListener("click", fn => { // Инициализация кнопки let button = wrap.getElementsByClassName('ui_toggler')[0]; if (button.classList.contains('on')) { // Активирована if (settings.write(group + '_' + id, false)) { // Записан статус активации // Запуск анимации и переход в состояние деактивации button.classList.remove('on'); settings.read(group + '_' + id).then(result => { if (result[group + '_' + id] === false) { // Сохранены изменения // Запуск анимации status.style.transition = '0.5s'; status.style.opacity = 1; setTimeout(fn => { status.style.transition = '1.5s'; status.style.opacity = 0; }, 1000); } }); } } else { // Деактивирована if (settings.write(group + '_' + id, true)) { // Записан статус активации // Запуск анимации и переход в состояние активации button.classList.add('on'); settings.read(group + '_' + id).then(result => { if (result[group + '_' + id] === true) { // Сохранены изменения // Запуск анимации status.style.transition = '0.5s'; status.style.opacity = 1; setTimeout(fn => { status.style.transition = '1.5s'; status.style.opacity = 0; }, 1000); } }); } } }); // Инициализация разделителя кнопки активации let separator = document.createElement('div'); separator.classList.add('settings_separated_row_extra'); separator.checked = result[id] === true || result[id] === 1 || result[id] === '1' ? true : false; // Инициализация кнопки активации let button = document.createElement('div'); button.classList.add('ui_toggler_wrap'); // Инициализация элемента-иконки кнопки активации let checkbox = document.createElement('div'); checkbox.classList.add('_ui_toggler', 'ui_toggler', '_settings_ienable'); settings.read(group + '_' + id).then(result => { // Получены данные о значении настройки // Запись состояния if (result[group + '_' + id]) checkbox.classList.add('on'); }); // Инициализация элемента-иконки кнопки активации let label = document.createElement('div'); label.classList.add('ui_toggler_label'); // Инициализация названия кнопки активации let header = document.createElement('div'); header.classList.add('settings_separated_row_text'); // Инициализация текста названия кнопки активации let title = document.createElement('div'); title.classList.add('settings_separated_row_text_inner'); title.innerText = name !== undefined && typeof name === 'string' ? name : id; // Инициализация архитектуры button.appendChild(checkbox); separator.appendChild(button); wrap.appendChild(separator); if (description !== undefined && typeof description === 'string') { // Получено описание // Инициализация текста описания кнопки активации let text = document.createElement('div'); text.classList.add('settings_separated_row_hint'); text.innerText = description; // Инициализация архитектуры title.appendChild(text); } // Инициализация архитектуры header.appendChild(title); wrap.appendChild(header); // Запись в блок body.appendChild(wrap); return true; }); } return false; }; } } }; // Инициализация ядра this.blocks.core = this.blocks.fields.core = this; } } // Запуск выполнения new page().init();