nadrez/firefox/pages/settings/index.js

460 lines
23 KiB
JavaScript
Raw Normal View History

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