newhelper-js 2.1.4 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (7) hide show
  1. package/LICENSE +24 -24
  2. package/README-en.md +27 -27
  3. package/README.md +33 -28
  4. package/docs.md +283 -283
  5. package/history.md +31 -31
  6. package/newHelper.js +1136 -1042
  7. package/package.json +45 -45
package/docs.md CHANGED
@@ -1,283 +1,283 @@
1
- Базовая документация (если поможет)
2
- - Внимание! документация предоставлена к внутренней версии 2.0.9, возможны расхождения с версией 2.1.4, рекомендуем сверяться с исходным кодом
3
-
4
- # Роутер (_.link)
5
- Роутер здесь завязан на особенном от популярных решений поведении. Берётся query строка, разбивается по "&", и из полученного массива дальше с этой строкой роутер работает обособленно. Сначала идёт элемент 0 который отвечает за страницы и вложенность, последующие элементы являются командами, на них вы можете навешать открытие окон, модалки, или просто всякие дебаг штучки (например отключение проверки наличия капчи при логине или смену языка)
6
- ## API:
7
- ### Конфиг:
8
- - basePage() - fallback страница на случай если страницы не существует, рекомендую ставить клиентскую страницу "404"
9
- - defTitle - отображаемое названия вкладки при открытии страницы
10
- - actions - словарь функций с ссылками
11
- - commands - словарь функций команд
12
- ### Базовые методы:
13
- - set(page, title) - устанавливает страницу
14
- - add(cmd) - добавляет команду в ссылку (если есть повторка добавления не будет)
15
- - remove(cmd) - удаляет команду из ссылки, если она есть
16
- ### Внутренние методы/свойства:
17
- - get() - обработать ссылку и вызвать нужные страницы и команды (допустим открыть ту или иную страницу, и вызвать модалки если их нет). Рекомендуется вызывать при старте приложения, автоматически срабатывает при событии popstate
18
- - _i - флаг запрещающий функции set() ставить новую страницу, по умолчанию true, но после каждого вызова set() становится false
19
- - _cmd - прослойка для сохранения команд между popstate событиями
20
- - compileLink() - возвращает скомпилированную ссылку в формате ["ключ=значение","ключ=значение"]. Не рекомендуется к использованию вообще
21
- ### Пример конфигурации (Object Hub):
22
- ```
23
- _.link.defTitle = 'Object Hub';
24
- _.link.basePage = ()=>{innerMain(pageMain())};
25
- _.lang.vars = {
26
- 'helperStrVer':helperStrVer,
27
- 'helperBuildNum':helperBuildNum,
28
- 'helperUrl':helperUrl
29
- };
30
- _.link.commands = {
31
- en: ()=> {_.lang.replace('EN',1)},
32
- ru: ()=> {_.lang.replace('RU',1)},
33
- ua: ()=> {_.lang.replace('UA',1)},
34
- de: ()=> {_.lang.replace('DE',1)},
35
- dev: ()=> {debugWindow()},
36
- ignoreCap: ()=> {ignoreCap = true}
37
- };
38
- _.link.actions = {
39
- '': ()=> {innerMain(pageMain())},
40
- find: ()=> {pageFind()},
41
-
42
- camp: (campId)=> {getCamp(campId)},
43
- show: (showId)=> {getShow(showId)},
44
- pere: (pereId)=> {getPere(pereId)},
45
- news: ()=> {globalNews()},
46
- 'news/': {
47
- '': ()=> {globalNews()},
48
- comms: (postId)=> {let d = postId.split('|');getNewsWithComments(d[0], d[1], d[2])},
49
- list: (gdpsId)=> {let d = gdpsId.split('|');helperNews(d[0], d[1])},
50
- },
51
- about: ()=> {innerMain(helperAbout())},
52
-
53
- profiles: (userId)=> {otherProfile(userId,'pageFind(0)')},
54
- 'profiles/': {
55
- '': (userId)=> {otherProfile(userId,'pageFind(0)')},
56
- camps: (userId)=> {otherProfile(userId,'pageFind(0)',otherCampsWindow)},
57
- shows: (userId)=> {otherProfile(userId,'pageFind(1)',otherShowsWindow)},
58
- peres: (userId)=> {otherProfile(userId,'pageFind(2)',otherPeresWindow)},
59
- wikis: (userId)=> {otherProfile(userId,'pageFind(0)',otherWikisWindow)},
60
- },
61
- };
62
- ```
63
-
64
- # Ленивый загрузчик (_.lazy)
65
- Ленивый загрузчик скриптов позволяет подгружать ненужные прямо сейчас части кода потом (как пример, панель управления вики в object hub подгружается только когда пользователь открывает её). Также позволяет грузить любые newHelper.js-совместимые библиотеки, но об этом позже
66
- ## API:
67
- ### Базовые методы:
68
- - load(url, ...args) - функция немедленной загрузки скрипта, как пример подгрузка капчи на object hub работает напрямую через неё. Возвращает промис, резолв которого происходит сразу после загрузки скрипта
69
- - register(scr, funcs) - регистрация lazy функций в конфиге, где первым аргументом идёт ссылка на ленивый скрипт, а вторым массив функций-точек входа (названия функций должны идти как строки). При регистрации функций пишет в консоль какие функции были зарегистрированы. Вешайта функции-точки входа на window, иначе функцмя объявится не глобально и у вас будет ошибка!
70
- ### Внутренние свойства/методы:
71
- - _(scr, fn) - надстройка для register() которая является прокси для загрузки.
72
- - loaded- объект с загруженными скриптами, каждая загруженная ссылка может быть промисом, что означает что она ещё загружается, или true
73
- ### Пример конфигурации (и запуска сайта, Object Hub):
74
- ```
75
- _.lazy.register('./static/devpanel.js',[
76
- 'debugWindow'
77
- ]);
78
- _.lazy.register('./static/publicWiki.js',[
79
- 'pageGuides',
80
- 'getGuide',
81
- ]);
82
- _.lazy.load('./static/ojhub.js')
83
- .then(e=>{
84
- reStart();
85
- });
86
- ```
87
-
88
- # Локализация (_.lang)
89
- Локализация в newHelper.js реализована довольно просто но мощно
90
- ## API:
91
- ### Конфиг:
92
- - addr - строка с адресом на папку где хранятся все языковые пакеты, обязательно перезаписывать в конфиге
93
- - vars - Объект подменяемых переменных, где в качестве ключа вы указываете нужную для подстановки переменную
94
- - main - Словарь с языковым пакетом
95
- ### Базовые методы:
96
- - load(name) - скачивает языковой пакет
97
- - parse(packet) - подменяет переменные из vars на их значения в пакете. Учтите что ваши ключи из vars должны быть обёрнуты знаками плюса (+переменная+)
98
- - replace(name) - немедленно скачать языковой пакет и распарсив его перевести сайт
99
- - win(i) - получить значение ключа пакета для окон
100
- ### Методы получения значений пакета:
101
- ВНИМАНИЕ! для краткости кода все методы ниже кроме from() самостоятельно формируют кусок html, принято такое решение было для краткости кода.
102
- - from(i) - получить голое значение ключа или сам ключ если его нет
103
- - text(i) - получить значение ключа пакета для обычных текстовых элементов
104
- - submit(i) - получить значение ключа пакета для <input type=submit>
105
- - input(i) - получить значение ключа пакета для обычного инпута
106
- - textarea(i) - получить значение ключа пакета для обычной textarea
107
- - img(i) - получить значение ключа пакета для картинки, где значением является адрес на картинку (будет полезно для создания меню языков, где языки будут флагами)
108
- ### Пример конфига и использования:
109
- ```
110
- _.lang.addr = `./languages/`;
111
- await _.lang.replace('RU'); // скачает `./languages/RU.json`
112
- console.log(_.lang.main) // Object {hi:'Привет мир!', langImage:'./static/ru.png'}
113
-
114
- console.log(`<h1${_.lang.text('hi')}/h1>`) // <h1 data-trans="hi">Привет мир!</h1>
115
- console.log(`<img${_.lang.img('langImage')}>`) // <img data-trans="langImage" src="./static/ru.png">
116
-
117
- await _.lang.replace('EN');
118
-
119
- console.log(`<h1${_.lang.text('hi')}/h1>`) // <h1 data-trans="hi">Hello world!</h1>
120
- console.log(`<img${_.lang.img('langImage')}>`) // <img data-trans="langImage" src="./static/en.png">
121
- ```
122
-
123
- # Кастомные горячие клавишы (_.hotkeys)
124
- Горячие клавишы реализованы через систему "зажал отпустил", каждое действие вызывает колбек, но вы можете сделать и обычные хоткеи оставив дейсвтие "отпустил" пустым
125
- ## API:
126
- ### Конфиг:
127
- - keys - Объект ключей, в теории его можно перезаписывать и устанавливать значение из localStorage, но на практике пока никто так не делал
128
- - on(combo, press, release) - Зарегистрировать горячую клавишу на сочетание, принимает в качестве имени клавишы KeyboardEvent.code, комбинируется разделителем + ('ShiftLeft+KeyZ' для зажатия шифта и клавишы "я"), вторым аргументом идёт колбек на нажатие или зажатие, третьим аргументом идёт колбек на отжатие
129
- - off(combo) - Удалить все хоткеи повешанные на комбинацию
130
- Если вы хотите сделать хоткей который будет работать на простое нажатие, просто оставьте третий аргумент в on() пустым
131
- ### Внутренние методы:
132
- - _parse - распарсить комбинацию в массив клавиш
133
- - _match - проверить зажаты ли нужные клавишы
134
- - _init - запустить движок путём навешивания чтения событий для keyDown и keyUp, плюсом идёт событие 'blur' которое отключает все запущенные хоткеи
135
- - _i - внутренная переменная для _init которая не даёт запустить движок дважды
136
- ### Пример конфига (Object hub):
137
- ```
138
- _.hotkeys.on('ShiftLeft + F1', debugWindow);
139
- _.hotkeys.on(
140
- 'ShiftLeft+KeyZ',
141
- ()=>keyBindsList(),
142
- ()=>_.$.qa('[keybindslist]').forEach(e=>_.win.close(e.id))
143
- );
144
- ```
145
-
146
-
147
- # Движок окон (_.win)
148
- Вот она главная фишка библиотеки! Учтите что мы НЕ советуем вам переопределять встроенные методы, т.к. у движка окон ещё большой задел под оптимизацию кода или расширение функционала, никто же ведь не хочет словить краш на старте вашего сайта из-за появления возможности переименовывать окна?
149
- ## API:
150
- ### Конфиг:
151
- - manager - DOM элемент с открытыми окнами
152
- - hider - DOM элемент с открытыми окнами
153
- - winAttrs - Атрибуты открытых окон, рекомендуем указывать класс с анимацией окна и стилии
154
- - dragAttrs - Атрибуты элемента драга
155
- - titleAttrs - Атрибуты назнвания окна
156
- - renameAttrs - Атрибуты инпута при переименовании окна
157
- - btnAttrs - Атрибуты кнопок окон, рекомендую отключать задний фон, желательно через классы
158
- - defBtns - Кастомные кнопки, по умолчанию уже имеет кнопки скрытия, разворота на весь экран и закрытия
159
- - hiderAttrs - Атрибуты кнопок для раскрытия свёрнутых окон
160
- - animOpen - Название класса с анимацией открытия
161
- - animClose - Название класса с анимацией закрытия
162
- - animHide - Название класса с анимацией сворачивания окна
163
- - animShow - Название класса с анимацией разворачивания окна
164
- - animFullOn - Название класса с входом в режим полного окна
165
- - animFullOff - Название класса с выходом из режима полного окна
166
- ### Базовые методы:
167
- - open(name, content, customAttrs) - Открыть окно
168
- - toggleFull(winId) - развернуть окно на весь экран, если уже развернуто вернуть в исходное состояние
169
- - setTitle(winId, newTitle) - Переименовать окно. Осторожно, при переименовании окна смена языка не сможет изменить название окна
170
- - close(winId) - закрыть окно
171
- - hide(winId) - скрыть окно и создать "хайдер"
172
- - show(winId) - развернуть окно и удалить "хайдер"
173
- ### Внутренние методы на this:
174
- - _winBtn(winIdtext, func) - кнопка окна, в будущем функционал кнопок будет расширен для создания кастомных кнопок
175
- - _hiderBtn(text) - кнопка для разворота окна
176
- - _initWin() - запустить драггер окна
177
- - _ID() - сгенерировать уникальный айди окна
178
- Внешние свойства:
179
- - _.wins - коллекция открытых окон
180
-
181
- # Ошибки (_.err)
182
- Ошибки обрабатываются всегда и глобально несмотря ни на что, только если они были пойманы обработчиками. Рекомендую загружать другие библиотеки через ленивую загрузку (обычным load() прямо в конфиге()) чтобы потом модуль ошибок не упадал в саморекурсию из-за отсутствия в стеке разделителя "&helper:"
183
- ## API:
184
- ### Базовые свойства/методы:
185
- - errors - объект со всеми ошибками случившимися за сессию
186
- - _c - счётчик ошибок
187
- - log(err, addr) - сохраняет ошибку и добавляет к счётчику единичку
188
- ### Методы отлова (по умолчанию глобальные, имеют возможность находить точную строку ошибки):
189
- - handleGlobal(message, source, line, column, error) - словить обычную ошибку и сохранить её
190
- - handleRejection(e) - словить отклонение промиса если не было поймано
191
- ### Конфиг:
192
- - print(errID, err, addr) - ваш кастомный обработчик ошибок. Мы вам очень рекомендуем для дев среды назначить вот такой обработчик:
193
- ```js
194
- let windowBtns = [
195
- ['COPY ERROR', `navigator.clipboard.writeText(_.$.id('errText{errID}').innerText)`],
196
- ['FULL RESTART', `location.reload()`],
197
- // ваши прочие нужные методы, например перезапуск приложения без перезагрузки страницы, или сброс storage и перезапуск приложения
198
- ];
199
- _.err.print = (errID, errText, addr = '')=>{
200
- let buttonErr = (i, clck)=>`<button style=background-color:#333 onclick="${clck}">${i}</button> `,
201
- buttons = '',
202
- html = _.html`<div id=debug${errID}>
203
- <p align=center>DEBUG INFO</p>
204
- ERROR<br>
205
- <pre style=width:100%;white-space:pre-line id=debugMega${errID}></pre>
206
- <br><br>
207
- <center id=windows${errID}>
208
- </center>
209
- </div>`;
210
- console.log(html);
211
- _.$.q('#debugMega'+errID, html).textContent = `LOCATION: ${location}\n`+errText+`\n`+
212
- (addr === '' ? '' : `\n${addr}`);
213
-
214
- windowBtns.forEach(btn=>{
215
- buttons += buttonErr(btn[0], btn[1].replaceAll('{errID}', errID));
216
- });
217
- _.$.q('#windows'+errID, html).innerHTML = buttons;
218
-
219
- let winId = _.win.open('debug'+errID,
220
- html
221
- , `iserror style=width:300px;height:350px`);
222
- ```
223
-
224
- # Прочие утилиты, которым не особо нужно описание:
225
- ## http-клиент на базе xhr
226
- - defaultHeaders - Хедеры которые всегда будут назначаться при запросах, вы можете назначить туда токен пользователя
227
- - req(method, url, data, headers, fileProgressElement) - сделать запрос с различным методом, fileProgressElement требуется указывать лишь в случае если нужно отслеживать прогресс загрузки файла, не рекомендуется задавать свойства min и max
228
- ## DOM утилиты:
229
- - _.$.q(i,p=document), алиас к document.querySelector(i,p), где p может быть любым DOM пространством
230
- - _.$.qa, алиас к document.querySelectorAll(i,p), где p может быть любым DOM пространством
231
- - _.$.id(i) - алиас к document.getElementById(i), у неё нет аргумента p так как он не работает в других пространствах имён
232
- - _.html - превратить шаблонную строку в DOM элемент(ы)
233
- - _.storage - обычная изолирующая обёртка над классом Storage, имеет почти идентичные методы, разве что прямое обращение и перезапись недоступны
234
-
235
- # Плагины?..
236
- Да! и ещё как! поскольку newHelper.js является обычным набором javascript инструментов, помещённых в объект "_" вы можете спокойно загрузить вообще любой скрипт через _.lazy, даже не просто загрузить а повешать на лень если они вам не нужны прямо сейчас!
237
-
238
- # Чеклист конфигов
239
- _.link
240
- - basePage() - fallback страница на случай если страницы не существует
241
- - defTitle - отображаемое названия вкладки при открытии страницы
242
- - actions - словарь функций с ссылками
243
- - commands - словарь функций команд
244
-
245
- _.lazy
246
- - load(url, ...args) - функция немедленной загрузки скрипта
247
- - register(scr, funcs) - регистрация lazy функций в конфиге
248
-
249
- _.lang
250
- - addr - строка с адресом на папку где хранятся все языковые пакеты
251
- - vars - Объект подменяемых переменных
252
- - main - Словарь с языковым пакетом
253
-
254
- _.hotkeys
255
- - keys - Объект ключей
256
- - on(combo, press, release) - Зарегистрировать горячую клавишу на сочетание
257
- - off(combo) - Удалить все хоткеи повешанные на комбинацию
258
-
259
- _.err
260
- - print(errID, err, addr) - ваш кастомный обработчик ошибок
261
-
262
- _.http
263
- - defaultHeaders
264
-
265
- _.storage
266
- сам себе конфиг
267
-
268
- _.win
269
- - manager - DOM элемент с открытыми окнами
270
- - hider - DOM элемент с открытыми окнами
271
- - winAttrs - Атрибуты открытых окон
272
- - dragAttrs - Атрибуты элемента драга
273
- - titleAttrs - Атрибуты назнвания окна
274
- - renameAttrs - Атрибуты инпута при переименовании окна
275
- - btnAttrs - Атрибуты кнопок окон
276
- - defBtns - Кастомные кнопки, по умолчанию уже имеет кнопки
277
- - hiderAttrs - Атрибуты кнопок для раскрытия свёрнутых окон
278
- - animOpen - Название класса с анимацией открытия
279
- - animClose - Название класса с анимацией закрытия
280
- - animHide - Название класса с анимацией сворачивания окна
281
- - animShow - Название класса с анимацией разворачивания окна
282
- - animFullOn - Название класса с входом в режим полного окна
283
- - animFullOff - Название класса с выходом из режима полного окна
1
+ Базовая документация (если поможет)
2
+ - Внимание! документация предоставлена к внутренней версии 2.0.9, возможны расхождения с версией 2.1.4, рекомендуем сверяться с исходным кодом
3
+
4
+ # Роутер (_.link)
5
+ Роутер здесь завязан на особенном от популярных решений поведении. Берётся query строка, разбивается по "&", и из полученного массива дальше с этой строкой роутер работает обособленно. Сначала идёт элемент 0 который отвечает за страницы и вложенность, последующие элементы являются командами, на них вы можете навешать открытие окон, модалки, или просто всякие дебаг штучки (например отключение проверки наличия капчи при логине или смену языка)
6
+ ## API:
7
+ ### Конфиг:
8
+ - basePage() - fallback страница на случай если страницы не существует, рекомендую ставить клиентскую страницу "404"
9
+ - defTitle - отображаемое названия вкладки при открытии страницы
10
+ - actions - словарь функций с ссылками
11
+ - commands - словарь функций команд
12
+ ### Базовые методы:
13
+ - set(page, title) - устанавливает страницу
14
+ - add(cmd) - добавляет команду в ссылку (если есть повторка добавления не будет)
15
+ - remove(cmd) - удаляет команду из ссылки, если она есть
16
+ ### Внутренние методы/свойства:
17
+ - get() - обработать ссылку и вызвать нужные страницы и команды (допустим открыть ту или иную страницу, и вызвать модалки если их нет). Рекомендуется вызывать при старте приложения, автоматически срабатывает при событии popstate
18
+ - _i - флаг запрещающий функции set() ставить новую страницу, по умолчанию true, но после каждого вызова set() становится false
19
+ - _cmd - прослойка для сохранения команд между popstate событиями
20
+ - compileLink() - возвращает скомпилированную ссылку в формате ["ключ=значение","ключ=значение"]. Не рекомендуется к использованию вообще
21
+ ### Пример конфигурации (Object Hub):
22
+ ```
23
+ _.link.defTitle = 'Object Hub';
24
+ _.link.basePage = ()=>{innerMain(pageMain())};
25
+ _.lang.vars = {
26
+ 'helperStrVer':helperStrVer,
27
+ 'helperBuildNum':helperBuildNum,
28
+ 'helperUrl':helperUrl
29
+ };
30
+ _.link.commands = {
31
+ en: ()=> {_.lang.replace('EN',1)},
32
+ ru: ()=> {_.lang.replace('RU',1)},
33
+ ua: ()=> {_.lang.replace('UA',1)},
34
+ de: ()=> {_.lang.replace('DE',1)},
35
+ dev: ()=> {debugWindow()},
36
+ ignoreCap: ()=> {ignoreCap = true}
37
+ };
38
+ _.link.actions = {
39
+ '': ()=> {innerMain(pageMain())},
40
+ find: ()=> {pageFind()},
41
+
42
+ camp: (campId)=> {getCamp(campId)},
43
+ show: (showId)=> {getShow(showId)},
44
+ pere: (pereId)=> {getPere(pereId)},
45
+ news: ()=> {globalNews()},
46
+ 'news/': {
47
+ '': ()=> {globalNews()},
48
+ comms: (postId)=> {let d = postId.split('|');getNewsWithComments(d[0], d[1], d[2])},
49
+ list: (gdpsId)=> {let d = gdpsId.split('|');helperNews(d[0], d[1])},
50
+ },
51
+ about: ()=> {innerMain(helperAbout())},
52
+
53
+ profiles: (userId)=> {otherProfile(userId,'pageFind(0)')},
54
+ 'profiles/': {
55
+ '': (userId)=> {otherProfile(userId,'pageFind(0)')},
56
+ camps: (userId)=> {otherProfile(userId,'pageFind(0)',otherCampsWindow)},
57
+ shows: (userId)=> {otherProfile(userId,'pageFind(1)',otherShowsWindow)},
58
+ peres: (userId)=> {otherProfile(userId,'pageFind(2)',otherPeresWindow)},
59
+ wikis: (userId)=> {otherProfile(userId,'pageFind(0)',otherWikisWindow)},
60
+ },
61
+ };
62
+ ```
63
+
64
+ # Ленивый загрузчик (_.lazy)
65
+ Ленивый загрузчик скриптов позволяет подгружать ненужные прямо сейчас части кода потом (как пример, панель управления вики в object hub подгружается только когда пользователь открывает её). Также позволяет грузить любые newHelper.js-совместимые библиотеки, но об этом позже
66
+ ## API:
67
+ ### Базовые методы:
68
+ - load(url, ...args) - функция немедленной загрузки скрипта, как пример подгрузка капчи на object hub работает напрямую через неё. Возвращает промис, резолв которого происходит сразу после загрузки скрипта
69
+ - register(scr, funcs) - регистрация lazy функций в конфиге, где первым аргументом идёт ссылка на ленивый скрипт, а вторым массив функций-точек входа (названия функций должны идти как строки). При регистрации функций пишет в консоль какие функции были зарегистрированы. Вешайта функции-точки входа на window, иначе функцмя объявится не глобально и у вас будет ошибка!
70
+ ### Внутренние свойства/методы:
71
+ - _(scr, fn) - надстройка для register() которая является прокси для загрузки.
72
+ - loaded- объект с загруженными скриптами, каждая загруженная ссылка может быть промисом, что означает что она ещё загружается, или true
73
+ ### Пример конфигурации (и запуска сайта, Object Hub):
74
+ ```
75
+ _.lazy.register('./static/devpanel.js',[
76
+ 'debugWindow'
77
+ ]);
78
+ _.lazy.register('./static/publicWiki.js',[
79
+ 'pageGuides',
80
+ 'getGuide',
81
+ ]);
82
+ _.lazy.load('./static/ojhub.js')
83
+ .then(e=>{
84
+ reStart();
85
+ });
86
+ ```
87
+
88
+ # Локализация (_.lang)
89
+ Локализация в newHelper.js реализована довольно просто но мощно
90
+ ## API:
91
+ ### Конфиг:
92
+ - addr - строка с адресом на папку где хранятся все языковые пакеты, обязательно перезаписывать в конфиге
93
+ - vars - Объект подменяемых переменных, где в качестве ключа вы указываете нужную для подстановки переменную
94
+ - main - Словарь с языковым пакетом
95
+ ### Базовые методы:
96
+ - load(name) - скачивает языковой пакет
97
+ - parse(packet) - подменяет переменные из vars на их значения в пакете. Учтите что ваши ключи из vars должны быть обёрнуты знаками плюса (+переменная+)
98
+ - replace(name) - немедленно скачать языковой пакет и распарсив его перевести сайт
99
+ - win(i) - получить значение ключа пакета для окон
100
+ ### Методы получения значений пакета:
101
+ ВНИМАНИЕ! для краткости кода все методы ниже кроме from() самостоятельно формируют кусок html, принято такое решение было для краткости кода.
102
+ - from(i) - получить голое значение ключа или сам ключ если его нет
103
+ - text(i) - получить значение ключа пакета для обычных текстовых элементов
104
+ - submit(i) - получить значение ключа пакета для <input type=submit>
105
+ - input(i) - получить значение ключа пакета для обычного инпута
106
+ - textarea(i) - получить значение ключа пакета для обычной textarea
107
+ - img(i) - получить значение ключа пакета для картинки, где значением является адрес на картинку (будет полезно для создания меню языков, где языки будут флагами)
108
+ ### Пример конфига и использования:
109
+ ```
110
+ _.lang.addr = `./languages/`;
111
+ await _.lang.replace('RU'); // скачает `./languages/RU.json`
112
+ console.log(_.lang.main) // Object {hi:'Привет мир!', langImage:'./static/ru.png'}
113
+
114
+ console.log(`<h1${_.lang.text('hi')}/h1>`) // <h1 data-trans="hi">Привет мир!</h1>
115
+ console.log(`<img${_.lang.img('langImage')}>`) // <img data-trans="langImage" src="./static/ru.png">
116
+
117
+ await _.lang.replace('EN');
118
+
119
+ console.log(`<h1${_.lang.text('hi')}/h1>`) // <h1 data-trans="hi">Hello world!</h1>
120
+ console.log(`<img${_.lang.img('langImage')}>`) // <img data-trans="langImage" src="./static/en.png">
121
+ ```
122
+
123
+ # Кастомные горячие клавишы (_.hotkeys)
124
+ Горячие клавишы реализованы через систему "зажал отпустил", каждое действие вызывает колбек, но вы можете сделать и обычные хоткеи оставив дейсвтие "отпустил" пустым
125
+ ## API:
126
+ ### Конфиг:
127
+ - keys - Объект ключей, в теории его можно перезаписывать и устанавливать значение из localStorage, но на практике пока никто так не делал
128
+ - on(combo, press, release) - Зарегистрировать горячую клавишу на сочетание, принимает в качестве имени клавишы KeyboardEvent.code, комбинируется разделителем + ('ShiftLeft+KeyZ' для зажатия шифта и клавишы "я"), вторым аргументом идёт колбек на нажатие или зажатие, третьим аргументом идёт колбек на отжатие
129
+ - off(combo) - Удалить все хоткеи повешанные на комбинацию
130
+ Если вы хотите сделать хоткей который будет работать на простое нажатие, просто оставьте третий аргумент в on() пустым
131
+ ### Внутренние методы:
132
+ - _parse - распарсить комбинацию в массив клавиш
133
+ - _match - проверить зажаты ли нужные клавишы
134
+ - _init - запустить движок путём навешивания чтения событий для keyDown и keyUp, плюсом идёт событие 'blur' которое отключает все запущенные хоткеи
135
+ - _i - внутренная переменная для _init которая не даёт запустить движок дважды
136
+ ### Пример конфига (Object hub):
137
+ ```
138
+ _.hotkeys.on('ShiftLeft + F1', debugWindow);
139
+ _.hotkeys.on(
140
+ 'ShiftLeft+KeyZ',
141
+ ()=>keyBindsList(),
142
+ ()=>_.$.qa('[keybindslist]').forEach(e=>_.win.close(e.id))
143
+ );
144
+ ```
145
+
146
+
147
+ # Движок окон (_.win)
148
+ Вот она главная фишка библиотеки! Учтите что мы НЕ советуем вам переопределять встроенные методы, т.к. у движка окон ещё большой задел под оптимизацию кода или расширение функционала, никто же ведь не хочет словить краш на старте вашего сайта из-за появления возможности переименовывать окна?
149
+ ## API:
150
+ ### Конфиг:
151
+ - manager - DOM элемент с открытыми окнами
152
+ - hider - DOM элемент с открытыми окнами
153
+ - winAttrs - Атрибуты открытых окон, рекомендуем указывать класс с анимацией окна и стилии
154
+ - dragAttrs - Атрибуты элемента драга
155
+ - titleAttrs - Атрибуты назнвания окна
156
+ - renameAttrs - Атрибуты инпута при переименовании окна
157
+ - btnAttrs - Атрибуты кнопок окон, рекомендую отключать задний фон, желательно через классы
158
+ - defBtns - Кастомные кнопки, по умолчанию уже имеет кнопки скрытия, разворота на весь экран и закрытия
159
+ - hiderAttrs - Атрибуты кнопок для раскрытия свёрнутых окон
160
+ - animOpen - Название класса с анимацией открытия
161
+ - animClose - Название класса с анимацией закрытия
162
+ - animHide - Название класса с анимацией сворачивания окна
163
+ - animShow - Название класса с анимацией разворачивания окна
164
+ - animFullOn - Название класса с входом в режим полного окна
165
+ - animFullOff - Название класса с выходом из режима полного окна
166
+ ### Базовые методы:
167
+ - open(name, content, customAttrs) - Открыть окно
168
+ - toggleFull(winId) - развернуть окно на весь экран, если уже развернуто вернуть в исходное состояние
169
+ - setTitle(winId, newTitle) - Переименовать окно. Осторожно, при переименовании окна смена языка не сможет изменить название окна
170
+ - close(winId) - закрыть окно
171
+ - hide(winId) - скрыть окно и создать "хайдер"
172
+ - show(winId) - развернуть окно и удалить "хайдер"
173
+ ### Внутренние методы на this:
174
+ - _winBtn(winIdtext, func) - кнопка окна, в будущем функционал кнопок будет расширен для создания кастомных кнопок
175
+ - _hiderBtn(text) - кнопка для разворота окна
176
+ - _initWin() - запустить драггер окна
177
+ - _ID() - сгенерировать уникальный айди окна
178
+ Внешние свойства:
179
+ - _.wins - коллекция открытых окон
180
+
181
+ # Ошибки (_.err)
182
+ Ошибки обрабатываются всегда и глобально несмотря ни на что, только если они были пойманы обработчиками. Рекомендую загружать другие библиотеки через ленивую загрузку (обычным load() прямо в конфиге()) чтобы потом модуль ошибок не упадал в саморекурсию из-за отсутствия в стеке разделителя "&helper:"
183
+ ## API:
184
+ ### Базовые свойства/методы:
185
+ - errors - объект со всеми ошибками случившимися за сессию
186
+ - _c - счётчик ошибок
187
+ - log(err, addr) - сохраняет ошибку и добавляет к счётчику единичку
188
+ ### Методы отлова (по умолчанию глобальные, имеют возможность находить точную строку ошибки):
189
+ - handleGlobal(message, source, line, column, error) - словить обычную ошибку и сохранить её
190
+ - handleRejection(e) - словить отклонение промиса если не было поймано
191
+ ### Конфиг:
192
+ - print(errID, err, addr) - ваш кастомный обработчик ошибок. Мы вам очень рекомендуем для дев среды назначить вот такой обработчик:
193
+ ```js
194
+ let windowBtns = [
195
+ ['COPY ERROR', `navigator.clipboard.writeText(_.$.id('errText{errID}').innerText)`],
196
+ ['FULL RESTART', `location.reload()`],
197
+ // ваши прочие нужные методы, например перезапуск приложения без перезагрузки страницы, или сброс storage и перезапуск приложения
198
+ ];
199
+ _.err.print = (errID, errText, addr = '')=>{
200
+ let buttonErr = (i, clck)=>`<button style=background-color:#333 onclick="${clck}">${i}</button> `,
201
+ buttons = '',
202
+ html = _.html`<div id=debug${errID}>
203
+ <p align=center>DEBUG INFO</p>
204
+ ERROR<br>
205
+ <pre style=width:100%;white-space:pre-line id=debugMega${errID}></pre>
206
+ <br><br>
207
+ <center id=windows${errID}>
208
+ </center>
209
+ </div>`;
210
+ console.log(html);
211
+ _.$.q('#debugMega'+errID, html).textContent = `LOCATION: ${location}\n`+errText+`\n`+
212
+ (addr === '' ? '' : `\n${addr}`);
213
+
214
+ windowBtns.forEach(btn=>{
215
+ buttons += buttonErr(btn[0], btn[1].replaceAll('{errID}', errID));
216
+ });
217
+ _.$.q('#windows'+errID, html).innerHTML = buttons;
218
+
219
+ let winId = _.win.open('debug'+errID,
220
+ html
221
+ , `iserror style=width:300px;height:350px`);
222
+ ```
223
+
224
+ # Прочие утилиты, которым не особо нужно описание:
225
+ ## http-клиент на базе xhr
226
+ - defaultHeaders - Хедеры которые всегда будут назначаться при запросах, вы можете назначить туда токен пользователя
227
+ - req(method, url, data, headers, fileProgressElement) - сделать запрос с различным методом, fileProgressElement требуется указывать лишь в случае если нужно отслеживать прогресс загрузки файла, не рекомендуется задавать свойства min и max
228
+ ## DOM утилиты:
229
+ - _.$.q(i,p=document), алиас к document.querySelector(i,p), где p может быть любым DOM пространством
230
+ - _.$.qa, алиас к document.querySelectorAll(i,p), где p может быть любым DOM пространством
231
+ - _.$.id(i) - алиас к document.getElementById(i), у неё нет аргумента p так как он не работает в других пространствах имён
232
+ - _.html - превратить шаблонную строку в DOM элемент(ы)
233
+ - _.storage - обычная изолирующая обёртка над классом Storage, имеет почти идентичные методы, разве что прямое обращение и перезапись недоступны
234
+
235
+ # Плагины?..
236
+ Да! и ещё как! поскольку newHelper.js является обычным набором javascript инструментов, помещённых в объект "_" вы можете спокойно загрузить вообще любой скрипт через _.lazy, даже не просто загрузить а повешать на лень если они вам не нужны прямо сейчас!
237
+
238
+ # Чеклист конфигов
239
+ _.link
240
+ - basePage() - fallback страница на случай если страницы не существует
241
+ - defTitle - отображаемое названия вкладки при открытии страницы
242
+ - actions - словарь функций с ссылками
243
+ - commands - словарь функций команд
244
+
245
+ _.lazy
246
+ - load(url, ...args) - функция немедленной загрузки скрипта
247
+ - register(scr, funcs) - регистрация lazy функций в конфиге
248
+
249
+ _.lang
250
+ - addr - строка с адресом на папку где хранятся все языковые пакеты
251
+ - vars - Объект подменяемых переменных
252
+ - main - Словарь с языковым пакетом
253
+
254
+ _.hotkeys
255
+ - keys - Объект ключей
256
+ - on(combo, press, release) - Зарегистрировать горячую клавишу на сочетание
257
+ - off(combo) - Удалить все хоткеи повешанные на комбинацию
258
+
259
+ _.err
260
+ - print(errID, err, addr) - ваш кастомный обработчик ошибок
261
+
262
+ _.http
263
+ - defaultHeaders
264
+
265
+ _.storage
266
+ сам себе конфиг
267
+
268
+ _.win
269
+ - manager - DOM элемент с открытыми окнами
270
+ - hider - DOM элемент с открытыми окнами
271
+ - winAttrs - Атрибуты открытых окон
272
+ - dragAttrs - Атрибуты элемента драга
273
+ - titleAttrs - Атрибуты назнвания окна
274
+ - renameAttrs - Атрибуты инпута при переименовании окна
275
+ - btnAttrs - Атрибуты кнопок окон
276
+ - defBtns - Кастомные кнопки, по умолчанию уже имеет кнопки
277
+ - hiderAttrs - Атрибуты кнопок для раскрытия свёрнутых окон
278
+ - animOpen - Название класса с анимацией открытия
279
+ - animClose - Название класса с анимацией закрытия
280
+ - animHide - Название класса с анимацией сворачивания окна
281
+ - animShow - Название класса с анимацией разворачивания окна
282
+ - animFullOn - Название класса с входом в режим полного окна
283
+ - animFullOff - Название класса с выходом из режима полного окна