2022-06-24 10:54:57 +07:00
'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' , 'Активировать' ) ,
2022-11-11 18:54:10 +07:00
this . blocks . fields . text ( 'asdasdasd' , 'lightning' , 'Активировать' , 'asdasdasdasd' , 'Тестирование всплывающей подсказки' , 'text' , 0 , 8 , 'фффф' , 'сюда писать' ) ,
this . blocks . fields . checkbox ( 'list' , 'group' , 'Заблокированные ВКонтакте' , 'Удалять тех кто находится в списке заблокированных ВКонтакте' , 'Тестирование всплывающей подсказки' ) ,
2022-06-24 10:54:57 +07:00
this . blocks . fields . checkbox ( 'target' , 'list' , 'Отдельный список на удаление' , 'Выбрать пользователей вручную' ) ,
2022-11-11 18:54:10 +07:00
this . blocks . fields . dropdown ( 'targetasdasd' , 'promo' , 'Какаято хуитень' , 'Выбфывелей вручную' , 'Тестирование всплывающей подсказки' ) ,
2022-06-24 10:54:57 +07:00
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 = '' ) {
/ * *
2022-11-11 18:54:10 +07:00
* Запись в группу ( подразумевается выполнение в функции генерирующей группу )
2022-06-24 10:54:57 +07:00
*
* @ param { string } group Группа
*
* @ return { bool } Статус выполнения
* /
return function ( group ) {
if ( typeof group === 'string' && typeof text === 'string' ) {
// Пройдена проверка входных параметров
// Инициализация блока куда надо записать заголовок
2022-11-11 18:54:10 +07:00
const block = document . getElementById ( 'block_' + group ) ;
2022-06-24 10:54:57 +07:00
// Инициализация оболочки заголовка
2022-11-11 18:54:10 +07:00
const title = block . getElementsByTagName ( 'h2' ) [ 0 ] . getElementsByClassName ( 'page_block_header' ) [ 0 ] ;
2022-06-24 10:54:57 +07:00
// Запись содержимого в буфер
2022-11-11 18:54:10 +07:00
const buffer = title . cloneNode ( true ) ;
2022-06-24 10:54:57 +07:00
// Запись заголовка
title . innerText = text ;
// Запись содержимого заголовка из буфера
2022-11-11 18:54:10 +07:00
for ( let element of buffer . children ) title . appendChild ( element ) ;
2022-06-24 10:54:57 +07:00
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 = '' ) {
/ * *
2022-11-11 18:54:10 +07:00
* Запись в группу ( подразумевается выполнение в функции генерирующей группу )
2022-06-24 10:54:57 +07:00
*
* @ param { string } group Группа
*
* @ return { bool } Статус выполнения
* /
return function ( group ) {
if ( typeof group === 'string' && typeof left === 'string' && typeof center === 'string' && typeof right === 'string' ) {
// Пройдена проверка входных параметров
2022-11-11 18:54:10 +07:00
2022-06-24 10:54:57 +07:00
// Инициализация блока
2022-11-11 18:54:10 +07:00
const block = document . getElementById ( 'block_' + group ) ;
2022-06-24 10:54:57 +07:00
// Инициализация оболочки заголовка
2022-11-11 18:54:10 +07:00
const title = block . getElementsByTagName ( 'h2' ) [ 0 ] . getElementsByClassName ( 'page_block_header' ) [ 0 ] ;
2022-06-24 10:54:57 +07:00
// Запись заголовков
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 : {
2022-11-11 18:54:10 +07:00
macroses : {
/ * *
* Шаблон для инициализации элементов строки с полем
*
* @ param { string } group Группа
* @ param { string | null } icon Иконка
* @ param { function } content Функция которая будет обрабатывать содержимое макроса
* /
row ( group , icon , content ) {
// Инициализация блока
const block = document . getElementById ( 'block_' + group ) ;
// Инициализация головного элемента блока
const header = block . getElementsByClassName ( 'page_block_header' ) [ 0 ] ;
// Инициализация элемента с о статусом
const status = header . getElementsByClassName ( 'page_block_saved' ) [ 0 ] ;
// Инициализация тела блока
const body = block . getElementsByClassName ( 'settings_panel clear_fix settings_' + this . core . id + ' settings_section_' + this . core . id ) [ 0 ] ;
// Инициализация оболочки кнопки активации
const wrap = document . createElement ( 'div' ) ;
wrap . classList . add ( 'settings_separated_row' , this . core . icons [ icon ] ? ? this . core . icons [ 'lightning' ] , 'settings_separated_row_iconed' ) ;
// Инициализация разделителя
const separator = document . createElement ( 'div' ) ;
separator . classList . add ( 'settings_separated_row_extra' ) ;
// Генерация содержимого строки
return content ( status , body , wrap , separator ) ;
} ,
dropdown ( active , rows ) {
if ( typeof active === 'string' && typeof rows === 'object' ) {
// Пройдена проверка входных параметров
// Инициализация оболочки
const wrap = document . createElement ( 'div' ) ;
wrap . classList . add ( 'privacy_dropdown' , 'privacy_dropdown_mail' , 'pdd_ralign' ) ;
wrap . setAttribute ( 'style' , 'opacity: 1; display: none;' ) ;
// Инициализация списка строк
const list = document . createElement ( 'div' ) ;
list . classList . add ( 'rows' , 'rows__flex' ) ;
wrap . setAttribute ( 'style' , 'font-size: 13px;' ) ;
// Инициализация головной строки
const header = document . createElement ( 'div' ) ;
header . classList . add ( 'header' ) ;
wrap . setAttribute ( 'onclick' , 'Privacy.hide(-1)' ) ;
// Инициализация активной строки (выбранного параметра)
const active = document . createElement ( 'div' ) ;
active . classList . add ( 'header_label' ) ;
active . innerHTML = active ;
// Инициализация основной группы строк
const body = document . createElement ( 'div' ) ;
body . classList . add ( 'body' , 'body__flex' ) ;
body . setAttribute ( 'role' , 'list' ) ;
body . setAttribute ( 'aria-labelledby' , 'privacy_who_can_view' ) ;
for ( const row in rows ) {
// Перебор строк для генерации списка
// Инициализация кнопки
const button = document . createElement ( 'button' ) ;
}
}
return null ;
}
} ,
2022-06-24 10:54:57 +07:00
/ * *
* Генерация HTML - элемента настройки с кнопкой активации
*
* @ param { string } id Идентификатор
2022-11-11 18:54:10 +07:00
* @ param { string | null } icon Иконка
2022-06-24 10:54:57 +07:00
* @ param { string | null } name Название
2022-11-11 18:54:10 +07:00
* @ param { string | null } description Описание
* @ param { string | null } hint Всплывающая подсказка ( иконка с вопросительным знаком возле верхнего колонтинула )
* @ param { string | null } onchange Код который выполняется после изменения состояния
2022-06-24 10:54:57 +07:00
*
2022-11-11 18:54:10 +07:00
* @ return { function } Функция для выполнения в генераторе группы
2022-06-24 10:54:57 +07:00
*
* @ todo 1. Добавить проверку на существование нижнего колонтинула и записывать перед ним , вместо конца блока
* /
2022-11-11 18:54:10 +07:00
checkbox ( id , icon , name , description , hint , onchange ) {
2022-06-24 10:54:57 +07:00
// Инициализация ядра
2022-11-11 18:54:10 +07:00
const core = this . core ;
2022-06-24 10:54:57 +07:00
/ * *
2022-11-11 18:54:10 +07:00
* Запись в группу ( подразумевается выполнение в функции генерирующей группу )
2022-06-24 10:54:57 +07:00
*
* @ param { string } group Группа
*
* @ return { bool } Статус выполнения
* /
return function ( group ) {
2022-11-11 18:54:10 +07:00
if ( typeof id === 'string' && typeof core === 'object' && typeof group === 'string' ) {
2022-06-24 10:54:57 +07:00
// Пройдена проверка входных параметров
2022-11-11 18:54:10 +07:00
return core . blocks . fields . macros ( group , icon ,
function ( status , body , wrap , separator ) {
wrap . addEventListener ( "click" , fn => {
// Инициализация кнопки
const 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 === 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 === true ) {
// Сохранены изменения
// Запуск анимации
status . style . transition = '0.5s' ;
status . style . opacity = 1 ;
setTimeout ( fn => {
status . style . transition = '1.5s' ;
status . style . opacity = 0 ;
} , 1000 ) ;
}
} ) ;
}
}
} ) ;
// Инициализация кнопки активации
const button = document . createElement ( 'div' ) ;
button . classList . add ( 'ui_toggler_wrap' ) ;
// Инициализация элемента-иконки
const checkbox = document . createElement ( 'div' ) ;
checkbox . classList . add ( '_ui_toggler' , 'ui_toggler' , '_settings_ienable' ) ;
if ( typeof onchange === 'string' ) checkbox . setAttribute ( 'onchange' , onchange ) ;
settings . read ( group + '_' + id ) . then ( result => {
// Получены данные о значении настройки
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Запись состояния
if ( result ) checkbox . classList . add ( 'on' ) ;
} ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация элемента-иконки
const label = document . createElement ( 'div' ) ;
label . classList . add ( 'ui_toggler_label' ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация названия
const header = document . createElement ( 'div' ) ;
header . classList . add ( 'settings_separated_row_text' ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация текста названия
const colonic = document . createElement ( 'div' ) ;
colonic . classList . add ( 'settings_separated_row_text_inner' ) ;
colonic . innerText = name !== undefined && typeof name === 'string' ? name : id ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация архитектуры
button . appendChild ( checkbox ) ;
separator . appendChild ( button ) ;
wrap . appendChild ( separator ) ;
header . appendChild ( colonic ) ;
if ( typeof hint === 'string' ) {
// Получена подсказка
// Инициализация текста-подсказки
const question = document . createElement ( 'span' ) ;
question . classList . add ( 'hint_icon' ) ;
question . setAttribute ( 'data-title' , hint ) ;
question . setAttribute ( 'onmouseover' , 'showHint(this);' ) ;
// Инициализация архитектуры
colonic . appendChild ( question ) ;
}
if ( description !== undefined && typeof description === 'string' ) {
// Получено описание
// Инициализация текста описания
const text = document . createElement ( 'div' ) ;
text . classList . add ( 'settings_separated_row_hint' ) ;
text . innerText = description ;
// Инициализация архитектуры
colonic . appendChild ( text ) ;
}
// Инициализация архитектуры
wrap . appendChild ( header ) ;
// Запись в блок
body . appendChild ( wrap ) ;
return true ;
}
) ;
}
return false ;
} ;
} ,
/ * *
* Генерация HTML - элемента настройки с полем для ввода текста
*
* @ param { string } id Идентификатор
* @ param { string | null } icon Иконка
* @ param { string | null } name Название
* @ param { string | null } description Описание
* @ param { string | null } hint Всплывающая подсказка ( иконка с вопросительным знаком возле верхнего колонтинула )
* @ param { string | null } type Тип поля для ввода ( HTML - категории : text , password , email , number )
* @ param { number | null } min Ограничение по минимальному количеству символов
* @ param { number | null } max Ограничение по максимальному количеству символов
* @ param { string | null } title Текст выводимый во всплывающем окне при наведении курсора
* @ param { string | null } placeholder Текст отображаемый в поле для ввода если оно пустое
* @ param { string | null } pattern Шаблон значений которые позволено вводить в поле
* @ param { boolean | null } readonly Запретить редактирование
* @ param { boolean | null } spellcheck Использовать проверку орфографии
* @ param { object | null } options Массив с о строками для автозаполнения поля
* @ param { string | null } onchange Код который выполняется после изменения состояния
* @ param { string | null } oninput Код который выполняется при вводе текста
*
* @ return { function } Функция для выполнения в генераторе группы
*
* @ todo 1. Добавить проверку на существование нижнего колонтинула и записывать перед ним , вместо конца блока
* /
text ( id , icon , name , description , hint , type = 'text' , min = 0 , max = 100 , title , placeholder , pattern , readonly , spellcheck , options , onchange , oninput ) {
// Инициализация ядра
const core = this . core ;
/ * *
* Запись в группу ( подразумевается выполнение в функции генерирующей группу )
*
* @ param { string } group Группа
*
* @ return { bool } Статус выполнения
* /
return function ( group ) {
if ( typeof id === 'string' && typeof icon === 'string' && typeof core === 'object' && typeof group === 'string' ) {
// Пройдена проверка входных параметров
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
return core . blocks . fields . macros ( group , icon ,
function ( status , body , wrap , separator ) {
wrap . addEventListener ( "input" , fn => {
// Инициализация поля ввода
const input = wrap . getElementsByTagName ( 'input' ) [ 0 ] ;
2022-06-25 12:53:12 +07:00
2022-11-11 18:54:10 +07:00
if ( settings . write ( group + '_' + id , input . value ) ) {
// Записано значение поля
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Запуск анимации
2022-06-24 10:54:57 +07:00
settings . read ( group + '_' + id ) . then ( result => {
2022-11-11 18:54:10 +07:00
if ( result === input . value ) {
2022-06-24 10:54:57 +07:00
// Сохранены изменения
2022-06-25 12:53:12 +07:00
2022-06-24 10:54:57 +07:00
// Запуск анимации
status . style . transition = '0.5s' ;
status . style . opacity = 1 ;
setTimeout ( fn => {
status . style . transition = '1.5s' ;
status . style . opacity = 0 ;
} , 1000 ) ;
}
} ) ;
}
2022-11-11 18:54:10 +07:00
} ) ;
// Инициализация элемента для ввода текста
const input = document . createElement ( 'input' ) ;
input . classList . add ( 'dark' ) ;
input . setAttribute ( 'type' , type ) ;
input . setAttribute ( type === 'number' ? 'min' : 'minlength' , min ) ;
input . setAttribute ( type === 'number' ? 'max' : 'maxlength' , max ) ;
if ( typeof title === 'string' ) input . setAttribute ( 'title' , title ) ;
if ( typeof placeholder === 'string' ) input . setAttribute ( 'placeholder' , placeholder ) ;
if ( typeof pattern === 'string' ) input . setAttribute ( 'pattern' , pattern ) ;
if ( readonly === true ) input . setAttribute ( 'readonly' , readonly ) ;
if ( spellcheck === true ) input . setAttribute ( 'spellcheck' , spellcheck ) ;
input . setAttribute ( 'list' , group + '_' + id + '_datalist' ) ;
settings . read ( group + '_' + id ) . then ( result => {
// Получены данные о значении настройки
// Запись значения в поле
if ( result ) input . value = result ;
} ) ;
if ( typeof onchange === 'string' ) input . setAttribute ( 'onchange' , onchange ) ;
if ( typeof oninput === 'string' ) input . setAttribute ( 'oninput' , oninput ) ;
if ( typeof options === 'object' && options . length > 0 ) {
// Инициализация элемента-списка для выбора значений автозаполнения
const datalist = document . createElement ( 'datalist' ) ;
datalist . id = group + '_' + id + '_datalist' ;
for ( const option of options ) {
// Перебор значений для автозаполнения поля
// Инициализация элемента с о значением автозаполнения
const element = document . createElement ( 'option' ) ;
element . setAttribute ( 'value' , option ) ;
// Запись в список
datalist . appendChild ( element ) ;
}
}
// Инициализация элемента-иконки
const label = document . createElement ( 'div' ) ;
label . classList . add ( 'ui_toggler_label' ) ;
// Инициализация названия
const header = document . createElement ( 'div' ) ;
header . classList . add ( 'settings_separated_row_text' ) ;
// Инициализация текста названия
const colonic = document . createElement ( 'div' ) ;
colonic . classList . add ( 'settings_separated_row_text_inner' ) ;
colonic . innerText = name !== undefined && typeof name === 'string' ? name : id ;
// Инициализация архитектуры
separator . appendChild ( input ) ;
if ( typeof datalist === 'object' ) separator . appendChild ( datalist ) ;
wrap . appendChild ( separator ) ;
header . appendChild ( colonic ) ;
if ( typeof hint === 'string' ) {
// Получена подсказка
// Инициализация текста-подсказки
const question = document . createElement ( 'span' ) ;
question . classList . add ( 'hint_icon' ) ;
question . setAttribute ( 'data-title' , hint ) ;
question . setAttribute ( 'onmouseover' , 'showHint(this);' ) ;
// Инициализация архитектуры
colonic . appendChild ( question ) ;
}
if ( description !== undefined && typeof description === 'string' ) {
// Получено описание
// Инициализация текста описания
const text = document . createElement ( 'div' ) ;
text . classList . add ( 'settings_separated_row_hint' ) ;
text . innerText = description ;
// Инициализация архитектуры
colonic . appendChild ( text ) ;
}
// Инициализация архитектуры
wrap . appendChild ( header ) ;
// Запись в блок
body . appendChild ( wrap ) ;
return true ;
}
) ;
}
return false ;
} ;
} ,
/ * *
* Генерация HTML - элемента настройки с всплывающим списком
*
* @ param { string } id Идентификатор
* @ param { string | null } icon Иконка
* @ param { string | null } name Название
* @ param { string | null } description Описание
* @ param { string | null } hint Всплывающая подсказка ( иконка с вопросительным знаком возле верхнего колонтинула )
* @ param { string | null } type
* @ param { string | null } button
* @ param { object | null } options Массив с о строками для автозаполнения поля
* @ param { string | null } onclick
* @ param { string | null } onchange Код который выполняется после изменения состояния
* @ param { string | null } oninput Код который выполняется при вводе текста
*
* @ return { function } Функция для выполнения в генераторе группы
*
* @ todo 1. Добавить проверку на существование нижнего колонтинула и записывать перед ним , вместо конца блока
* /
button ( id , icon , name , description , hint , type = 'dropdown' , value = 'Выбрать' , onclick , onchange , oninput ) {
// Инициализация ядра
const core = this . core ;
2022-06-25 12:53:12 +07:00
2022-11-11 18:54:10 +07:00
/ * *
* Запись в группу ( подразумевается выполнение в функции генерирующей группу )
*
* @ param { string } group Группа
*
* @ return { bool } Статус выполнения
* /
return function ( group ) {
if ( typeof id === 'string' && typeof icon === 'string' && typeof core === 'object' && typeof group === 'string' ) {
// Пройдена проверка входных параметров
return core . blocks . fields . macroses . row ( group , icon ,
function ( status , body , wrap , separator ) {
wrap . addEventListener ( "input" , fn => {
// Инициализация поля ввода
const input = wrap . getElementsByTagName ( 'input' ) [ 0 ] ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
if ( settings . write ( group + '_' + id , input . value ) ) {
// Записано значение поля
// Запуск анимации
2022-06-24 10:54:57 +07:00
settings . read ( group + '_' + id ) . then ( result => {
2022-11-11 18:54:10 +07:00
if ( result === input . value ) {
2022-06-24 10:54:57 +07:00
// Сохранены изменения
2022-06-25 12:53:12 +07:00
2022-06-24 10:54:57 +07:00
// Запуск анимации
status . style . transition = '0.5s' ;
status . style . opacity = 1 ;
setTimeout ( fn => {
status . style . transition = '1.5s' ;
status . style . opacity = 0 ;
} , 1000 ) ;
}
} ) ;
}
2022-11-11 18:54:10 +07:00
} ) ;
// Инициализация элемента-кнопки
const button = document . createElement ( 'a' ) ;
button . innerText = value ;
if ( typeof onchange === 'string' ) button . setAttribute ( 'onchange' , onchange ) ;
if ( typeof oninput === 'string' ) button . setAttribute ( 'oninput' , oninput ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
if ( type === 'dropdown' ) {
// Инициализация всплывающего списка
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация элемента-кнопки
button . setAttribute ( 'onclick' , 'return Privacy.show(this, event, \'mail\');' + typeof onclick === 'string' ? ' ' + onclick : '' ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация элемента-списка
const dropdown = core . blocks . fields . macroses . dropdown ( ) ;
2022-06-24 10:54:57 +07:00
2022-06-25 12:53:12 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация архитектуры
separator . appendChild ( button ) ;
} else if ( type === 'popup' ) {
// Инициализация всплывающего окна
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация элемента-кнопки
button . setAttribute ( 'href' , '#' ) ;
button . setAttribute ( 'onclick' , 'return Settings.showGroupMessagesNotifyBox(event, \'settings\');' + typeof onclick === 'string' ? ' ' + onclick : '' ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация архитектуры
separator . appendChild ( button ) ;
} else if ( type === 'button' ) {
// Инициализация кнопки
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация элемента-кнопки
if ( typeof onclick === 'string' ) button . setAttribute ( 'onclick' , onclick ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация архитектуры
separator . appendChild ( button ) ;
}
// Инициализация элемента-иконки
const label = document . createElement ( 'div' ) ;
label . classList . add ( 'ui_toggler_label' ) ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация названия
const header = document . createElement ( 'div' ) ;
header . classList . add ( 'settings_separated_row_text' ) ;
2022-06-25 12:53:12 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация текста названия
const colonic = document . createElement ( 'div' ) ;
colonic . classList . add ( 'settings_separated_row_text_inner' ) ;
colonic . innerText = name !== undefined && typeof name === 'string' ? name : id ;
2022-06-24 10:54:57 +07:00
// Инициализация архитектуры
2022-11-11 18:54:10 +07:00
separator . appendChild ( button ) ;
wrap . appendChild ( separator ) ;
header . appendChild ( colonic ) ;
if ( typeof hint === 'string' ) {
// Получена подсказка
// Инициализация текста-подсказки
const question = document . createElement ( 'span' ) ;
question . classList . add ( 'hint_icon' ) ;
question . setAttribute ( 'data-title' , hint ) ;
question . setAttribute ( 'onmouseover' , 'showHint(this);' ) ;
// Инициализация архитектуры
colonic . appendChild ( question ) ;
}
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
if ( description !== undefined && typeof description === 'string' ) {
// Получено описание
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация текста описания
const text = document . createElement ( 'div' ) ;
text . classList . add ( 'settings_separated_row_hint' ) ;
text . innerText = description ;
2022-06-24 10:54:57 +07:00
2022-11-11 18:54:10 +07:00
// Инициализация архитектуры
colonic . appendChild ( text ) ;
}
// Инициализация архитектуры
wrap . appendChild ( header ) ;
// Запись в блок
body . appendChild ( wrap ) ;
return true ;
}
) ;
2022-06-24 10:54:57 +07:00
}
return false ;
} ;
}
}
} ;
// Инициализация ядра
this . blocks . core = this . blocks . fields . core = this ;
}
}
// Запуск выполнения
new page ( ) . init ( ) ;