nadrez/firefox/pages/settings/index.js

460 lines
23 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'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();